2010-03-30 17 views
18

Co chcę zrobić, to całkiem proste: przechowuj dane w niestandardowym pliku konfiguracyjnym, który chcę później przeczytać.Jak utworzyć niestandardowy plik konfiguracyjny yaml w Symfony

Utworzono mój plik something.yml, który umieściłem w globalnym katalogu config. Wygląda na to, że:

prod: 
    test: ok 

dev: 
    test: ko 

all: 
    foo: bar 
    john: doe 

Potem skopiował config_handlers.yml a także umieścić go w katalogu config i dodaje następujące u góry pliku:

config/something.yml: 
    class: sfDefineEnvironmentConfigHandler 
    param: 
    prefix: something_ 

Ale jeśli ja” m dzwoni sfConfig::get("something_foo"); Wciąż otrzymuję NULL.

Co zrobiłem źle? Po prostu chcę odczytać wartości, więc nie trzeba tworzyć programu obsługi klienta custome, prawda?

Przeczytałem dokument tutaj: http://www.symfony-project.org/book/1_2/19-Mastering-Symfony-s-Configuration-Files mimo że używam wersji 1.4 (nie sądzę, że zmieniło się od tego czasu).

Edytuj: Oczywiście mogę użyć sfYaml::load(), ale chciałbym robić rzeczy w lepszy sposób.

+0

Z ciekawości, co można wykorzystać niestandardowy plik konfiguracyjny za to różni się od funkcjonalności istniejących plików konfiguracyjnych już oferujesz? Jeśli to tylko proste dane, co jest nie tak z app.yml? lub niestandardowa klasa w/lib /? – Tom

+0

app.yml działałby dobrze. Ale mówimy tutaj o wielu danych. Chciałbym po prostu zachować rozróżnienie. –

+0

Rozumiem, że ... format YAML jest dość niepoprawny w utrzymaniu, więc osobiście nie chciałem w ogóle przechodzić tej trasy do przechowywania danych, ale przypuszczam, że masz swoje powody. – Tom

Odpowiedz

5

To naprawdę proste, ale również trochę hacky:

Utwórz plik /config/config_handlers.yml i dodać to:

config/something.yml: 
    class: sfDefineEnvironmentConfigHandler 
    param: 
    prefix: something_ 

Następnie dodać te dwie linie do /web/index.php po ... getApplicationConfiguration() (a także dodawać je do frontend_dev .php i gdziekolwiek chcesz ten plik konfiguracyjny będzie dostępna):

$configCache = new sfConfigCache($configuration); 
include($configCache->checkConfig('config/something.yml')); 

Więc /web/index.php może wyglądać tak potem:

<?php 
require_once(dirname(__FILE__).'/../config/ProjectConfiguration.class.php'); 

$configuration = ProjectConfiguration::getApplicationConfiguration('frontend', 'prod', false); 
$configCache = new sfConfigCache($configuration); 
$configCache->checkConfig('config/something.yml'); 
sfContext::createInstance($configuration)->dispatch(); 

Btw: To jest również w dokumentacji cytowanym wy, chociaż checkConfig() wywołanie jest w innym miejscu. Spójrz na to: „Kiedy potrzebny jest kod na podstawie pliku map.yml i generowanych przez przewodnika myMapConfigHandler w aplikacji, należy wywołać następującą linię:”

Baw ;-)

+0

Dzięki, ale kiedy to zrobię, otrzymuję błąd: – Prasad

0

Czy wyczyszczone swoje pliki pamięci podręcznej?

php symfony cc 

W środowisku produkcyjnym wszystkie pliki konfiguracyjne, klasy itp. Są buforowane.

12

Nie modyfikuj pliku index.php, ponieważ jest brudny!

Juste dodać tę linię do aplikacji/frontend/config/frontendConfiguration.class.php

require_once($this->getConfigCache()->checkConfig('config/something.yml')); 

(dostosować z własnym nazwiskiem APP)

+0

najprostszy sposób i działa jak wdzięk –

1

jeśli buforowane config-file jest pusta, prawdopodobnie zapomniałem ustawić środowisko w twoim pliku yml.

jak:

all: 
    test: value1 
    test2: value2 

dev: 
    test2: value3 
5

Jeśli robisz to dla wtyczki trzeba załadować plik konfiguracyjny w metodzie initialize(). Możesz nadal używać pliku config_handlers.yml w katalogu konfiguracyjnym wtyczki lub pozwolić wtyczce załadować również program obsługi. Metoda

class myPluginConfiguration extends sfPluginConfiguration 
{ 
    public function setup() // loads handler if needed 
    { 
    if ($this->configuration instanceof sfApplicationConfiguration) 
    { 
     $configCache = $this->configuration->getConfigCache(); 
     $configCache->registerConfigHandler('config/features.yml', 'sfDefineEnvironmentConfigHandler', 
     array('prefix' => 'feature_')); 
     $configCache->checkConfig('config/features.yml'); 
    } 
    } 

    public function initialize() // loads the actual config file 
    { 
    if ($this->configuration instanceof sfApplicationConfiguration) 
    { 
     $configCache = $this->configuration->getConfigCache(); 
     include($configCache->checkConfig('config/features.yml')); 
    } 
    } 
} 

Wtyczka jest config initialize() jest wywoływana automatycznie przez klasy sfProjectConfiguration i wszystkich klasach appConfiguration koryta (spadku).

+0

Jestem pewien, że jest to miły sposób na dołączenie (niestandardowych) plików-yml, chociaż mam 'sfProjectConfiguration' zamiast "sfApplicationConfiguration". Czy zdajesz sobie sprawę, jak włączyć to w ten sposób? – LaVomit

1

działa we wszystkich plików aplikacji:

$configCache = sfApplicationConfiguration::getActive()->getConfigCache(); 
$configCache->registerConfigHandler('config/something.yml', 'sfDefineEnvironmentConfigHandler', Array('prefix' => 'something_')); 
include $configCache->checkConfig('config/something.yml'); 

Następnie można użyć:

sfConfig::get("something_foo");