2010-03-30 28 views
18

Quello che voglio fare è abbastanza semplice: memorizzare i dati in un file di configurazione personalizzato che voglio leggere in seguito.Come creare un file di configurazione yaml personalizzato in Symfony

Ho creato il mio file something.yml che ho inserito nella directory globale config. Sembra che:

prod: 
    test: ok 

dev: 
    test: ko 

all: 
    foo: bar 
    john: doe 

Poi ho copiato il config_handlers.yml e anche mettere nella directory di configurazione e ha aggiunto il seguente nella parte superiore del file:

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

Ma se io' Sto chiamando sfConfig::get("something_foo"); Continuo a ricevere NULL.

Cosa ho fatto di sbagliato? Voglio solo leggere i valori, quindi non è necessario creare un gestore di configurazione del custome, giusto?

Ho letto il documento qui: http://www.symfony-project.org/book/1_2/19-Mastering-Symfony-s-Configuration-Files anche se sto eseguendo 1.4 (non credo che sia cambiato da allora).

Edit: Certo che posso usare sfYaml::load() ma mi piacerebbe fare le cose in un modo migliore.

+0

Per curiosità, cosa vorresti usare il file di configurazione personalizzato per questo è diverso dalla funzionalità che i file di configurazione esistente già offerta? Se si tratta solo di dati semplici, cosa c'è di sbagliato in app.yml? o una classe personalizzata in/lib /? – Tom

+0

app.yml funzionerebbe bene. Ma stiamo parlando di molti dati qui. Vorrei solo mantenere le cose separate. –

+0

Vedo .... il formato YAML è abbastanza anonimo da mantenere, quindi personalmente non scenderò questa rotta per archiviare i dati, ma suppongo che tu abbia le tue ragioni. – Tom

risposta

5

E 'davvero facile, ma anche un po' hacky:

Creare il file /config/config_handlers.yml e aggiungere questo:

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

Quindi aggiungere queste due righe a /web/index.php dopo ... getApplicationConfiguration() (e anche aggiungere loro di frontend_dev .php e dove vuoi questo file di configurazione di essere a disposizione):

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

Così il vostro /web/index.php potrebbe assomigliare a questo seguito:

<?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: Questo è anche nella documentazione hai citato, anche se la chiamata checkConfig() è in un posto diverso. Cercare questo: "Quando è necessario il codice basato sul file map.yml e generato dal gestore myMapConfigHandler nell'applicazione, chiamare la seguente riga:"

Buon divertimento ;-)

+0

Grazie, ma quando faccio questo, ottengo l'errore: – Prasad

0

Hai svuotato la tua file di cache?

php symfony cc 

Nell'ambiente di produzione tutti i file di configurazione, le classi, ecc. Vengono memorizzati nella cache.

12

Non modificare index.php questo è sporco!

Juste aggiungere questa linea al vostro app/frontend/config/frontendConfiguration.class.php

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

(adattare con il proprio nome app)

+0

il modo più semplice e funziona come un fascino –

1

se il config-file memorizzato nella cache è vuota, probabilmente hai dimenticato di impostare l'ambiente nel tuo file yml.

come:

all: 
    test: value1 
    test2: value2 

dev: 
    test2: value3 
5

Se stai facendo questo per un plugin è necessario caricare il file di configurazione nel metodo initialize(). Puoi ancora utilizzare config_handlers.yml nella directory di configurazione del tuo plugin o lasciare che il plugin carichi anche il gestore.

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')); 
    } 
    } 
} 

metodo config initialize() del plugin viene chiamato automaticamente per classe sfProjectConfiguration e tutte le classi appConfiguration (attraverso eredità).

+0

Sono sicuro che questo è un bel modo per includere file XML personalizzati (anche se ho un 'sfProjectConfiguration' invece di un 'sfApplicationConfiguration'. Ti capita di sapere come includerlo in quel modo? – LaVomit

1

Funziona in tutti i file di applicazione:

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

quindi è possibile utilizzare:

sfConfig::get("something_foo"); 
Problemi correlati