2010-03-30 4 views
18

Ce que je veux faire est assez simple: stocker des données dans un fichier de configuration personnalisé que je veux lire plus tard. J'ai créé mon fichier something.yml que j'ai placé dans le répertoire config. On dirait que:Comment créer un fichier de configuration yaml personnalisé dans Symfony

prod: 
    test: ok 

dev: 
    test: ko 

all: 
    foo: bar 
    john: doe 

Je copié le config_handlers.yml et aussi le mettre dans le répertoire config et ajouté ce qui suit au début du fichier:

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

Mais si je m appelant sfConfig::get("something_foo"); Je continue d'obtenir NULL.

Qu'est-ce que j'ai fait de mal? Je veux juste lire des valeurs, donc pas besoin de créer un gestionnaire custome config, non?

J'ai lu le doc ici: http://www.symfony-project.org/book/1_2/19-Mastering-Symfony-s-Configuration-Files même si je cours 1.4 (je ne pense pas que cela a changé depuis).

Editer: Bien sûr, je peux utiliser sfYaml::load() mais j'aimerais mieux faire les choses.

+0

Par curiosité, qu'est-ce que vous utilisez le fichier de configuration personnalisé pour c'est différent de la fonctionnalité que les fichiers de configuration existants déjà offre? Si ce n'est que des données simples, qu'est-ce qui ne va pas avec app.yml? ou une classe personnalisée dans/lib /? – Tom

+0

app.yml fonctionnerait bien. Mais nous parlons de beaucoup de données ici. Je voudrais juste garder les choses séparées. –

+0

Je vois .... le format YAML est assez anormal à maintenir, donc personnellement, je n'irais pas du tout dans cette voie pour stocker des données mais je suppose que vous avez vos raisons. – Tom

Répondre

5

Il est vraiment facile, mais aussi un peu hacky:

Créer le fichier /config/config_handlers.yml et ajoutez ceci:

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

Puis ajouter ces deux lignes à /web/index.php après ... getApplicationConfiguration() (et les ajouter à frontend_dev .php et où vous voulez que ce fichier de configuration être disponible):

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

Ainsi, votre /web/index.php pourrait ressembler à ceci après:

<?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: Ceci est également dans la documentation que vous avez cité, bien que l'appel checkConfig() est dans un endroit différent. Cherchez ceci: « Quand vous avez besoin du code basé sur le fichier map.yml et généré par le gestionnaire myMapConfigHandler dans votre application, appelez la ligne suivante: »

Amusez-vous bien ;-)

+0

Merci, mais quand je fais cela, je reçois l'erreur: – Prasad

0

Avez-vous votre désélectionné fichiers cache?

php symfony cc 

Dans l'environnement de production, tous les fichiers de configuration, classes, etc ... sont mis en cache. Ne pas modifier l'index.php c'est sale!

12

ajouter cette ligne Juste à votre application/frontend/config/frontendConfiguration.class.php

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

(adaptez avec votre propre nom de l'application)

+0

la manière la plus simple et de travailler comme un charme –

1

si votre config-fichier cache est vide, vous J'ai probablement oublié de définir l'environnement dans votre fichier yml.

comme:

all: 
    test: value1 
    test2: value2 

dev: 
    test2: value3 
5

Si vous faites ce pour un plugin vous devez charger le fichier de configuration dans la méthode initialize(). Vous pouvez toujours utiliser config_handlers.yml dans le répertoire de configuration de votre plugin ou laisser le plugin charger le gestionnaire.

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

La méthode initialize du module de configuration() est automatiquement appelée par classe sfProjectConfiguration et toutes les classes d'appConfiguration (de succession de creux).

+0

Je suis sûr que c'est une bonne façon d'inclure (custom) yml-fichiers, même si j'ai un 'sfProjectConfiguration' au lieu d'un 'sfApplicationConfiguration'. Savez-vous comment l'inclure de cette façon? – LaVomit

1

Works dans tous les fichiers d'application:

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

vous pouvez utiliser:

sfConfig::get("something_foo"); 
Questions connexes