Saját konfigurációs file kezelés symfony 1.1 alatt

A projectjeinkben gyakran használunk saját config beállításokat. Ezt általában az app.yml-be pakoljuk, hiszen az kapásból elérhető az sfConfig::get()-en keresztül. A symfony book 19. fejezete alapján készíthetünk saját yaml fileokat és ahhoz saját config handler-t is.

A leírás végén szerepel egy egyszerű, de nagyszerű dolog: sfDefineEnvironmentConfigHandler használata. Csak megadjuk neki a config file helyét, a fenti osztályt és paraméterként, hogy milyen prefix-szel szeretnénk viszontlátni értékeinket. Szuper, environment függő értékeink már használhatók is. A szépséghiba, hogy ennyi symfony 1.1 alatt már nem elég.

Egészen egyszerűen nem érhetők el az értékek. Ha dev módban megnézzük a webdev toolbart, akkor tényleg nincsenek ott. Kis utánajárással eljutottam odáig, hogy a cache alatt megjelenik bár a config_handlers-hez tartozó php file, de egyáltalán nem olvassa be azt a rendszer. Nézzük meg egy kicsit jobban.

A symfony 1.1 nagy refactoring munkálatainak folyományaként a config fileok kezelése bekerült az sfApplicationConfiguration osztály felelőségi körébe (korábban talán az sfCore gondoskodott erről). Ez bennünket annyiban érdekel, hogy ha belekukkantunk az initConfiguration() metódusba, akkor ott látható, ahogy az berángatja a saját, gyári dolgait. A mienket viszont teljesen figyelmenkívül hagyja.

A symfonyban a config kezelést nem közvetlenül a handlereken, hanem az sfConfigCache osztályon keresztül érjük el. Ha van cache az osztálypéldány visszaadja azt, ha nincs akkor parse-olja a yaml-t, menti cache-be és behúzza azt. Ez annyiban érdekes, hogy ezt az osztályt használva nekünk kell kézzel berángatni a konfig adatainkat. Ehhez az alkalmazás konfiguráció (pl. config/frontendConfiguration.php) configure() metódusát javaslom:

class frontendConfiguration extends sfApplicationConfiguration
{
  public function configure()
  {
    // 1. lehetőség: a hosszabb út
    // elkérjük a filet és behúzzuk kézzel
    if ($file = $this->getConfigCache()->checkConfig("config/my.yml"))
    {
      include($file);
    }

    // 2. lehetőség: megkérjük a configCache-t hogy húzza be
    $this->getConfigCache()->import("config/my.yml");
  }
}

A checkConfig() metódusnak van még egy második, opcionális paraméter: $optional (alapértelmezett false), vagyis a kért cache file mindenképpen szükséges-e. Ha nem találja a filet, akkor exception-t dob.
Az import() igazából csak egy wrapper a checkConfig()-on, használatával pusztán rövidebb lesz a kódunk. Ennek is van még két opcionális paramétere: $once – az include_once használata a sima include helyett (alapértelmezett: true), valamint az előbb tárgyalt $optional.

Mielőtt befejezném felhívnám egy dologra a figyelmet: bár általában az sfContext-en keresztül érhetjük el a config cache-t, ebben az esetben ez nem működik. Amikor ez a folyamat lefut az sfContext még nem létezik, ezért kell az aktuális osztálytól elkérni egy példányt ($this->getConfigCache()).

Kategória: symfony, trükkök
Címke: , , ,
Közvetlen link a könyvjelzőhöz.

Vélemény, hozzászólás?

Adatok megadása vagy bejelentkezés valamelyik ikonnal:

WordPress.com Logo

Hozzászólhat a WordPress.com felhasználói fiók használatával. Kilépés / Módosítás )

Twitter kép

Hozzászólhat a Twitter felhasználói fiók használatával. Kilépés / Módosítás )

Facebook kép

Hozzászólhat a Facebook felhasználói fiók használatával. Kilépés / Módosítás )

Google+ kép

Hozzászólhat a Google+ felhasználói fiók használatával. Kilépés / Módosítás )

Kapcsolódás: %s