Comment créer un fichier de configuration yaml dans Symfony
Ce que je veux faire est assez simple: stocker des données dans un fichier de configuration personnalisé que je veux les lire plus tard.
j'ai créé mon fichier something.yml
que j'ai mis dans le global config
répertoire.
Il ressemble à ça:
prod:
test: ok
dev:
test: ko
all:
foo: bar
john: doe
puis j'ai copié les config_handlers.yml et aussi la mettre dans le répertoire config et a ajouté suivante au début du fichier:
config/something.yml:
class: sfDefineEnvironmentConfigHandler
param:
prefix: something_
Mais si je suis d'appeler sfConfig::get("something_foo");
je reçois NULL
.
Qu'est-ce que j'ai fait de mal? Je viens de voulez lire des valeurs, donc pas besoin de créer un custome gestionnaire de configuration, droit?
j'ai lu la doc ici: http://www.symfony-project.org/book/1_2/19-Mastering-Symfony-s-Configuration-Files même si je suis en 1.4 (je ne pense pas que changé depuis).
Edit: bien sûr, je peux utiliser sfYaml::load()
mais j'aimerais faire les choses dans une meilleure façon.
6 réponses
Ne pas modifier l'index.php c'est sale!
Juste ajouter cette ligne à votre application/frontend/config/frontendConfiguration.classe.php
require_once($this->getConfigCache()->checkConfig('config/something.yml'));
(s'adapter avec votre propre nom de l'application)
C'est vraiment facile, mais aussi un peu hacky:
Créer le fichier /config/config_handlers.yml
et d'ajouter ceci:
config/something.yml:
class: sfDefineEnvironmentConfigHandler
param:
prefix: something_
Puis ajoutez ces deux lignes /web/index.php
après ... getApplicationConfiguration()
(et aussi les ajouter à frontend_dev.php et où vous voulez, ce fichier de configuration disponible):
$configCache = new sfConfigCache($configuration);
include($configCache->checkConfig('config/something.yml'));
/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: c'est aussi dans la documentation que vous avez Citée, bien que l'appel checkConfig() soit à un endroit différent. Cherchez ceci: "lorsque vous avez besoin du code basé sur la carte.le fichier yml et généré par le handler myMapConfigHandler dans votre application, appelez la ligne suivante:"
amusez-vous ;-)
Si vous êtes en train de faire 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 laissez 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 config initialize() du plugin est appelée automatiquement par la classe sfProjectConfiguration et toutes les classes appConfiguration (trough inheritance).
si votre fichier de configuration en cache est vide, vous avez probablement oublié de définir l'environnement dans votre fichier yml.
comme:
all:
test: value1
test2: value2
dev:
test2: value3
Fonctionne dans tous les fichiers de l'application:
$configCache = sfApplicationConfiguration::getActive()->getConfigCache();
$configCache->registerConfigHandler('config/something.yml', 'sfDefineEnvironmentConfigHandler', Array('prefix' => 'something_'));
include $configCache->checkConfig('config/something.yml');
Ensuite, vous pouvez utiliser:
sfConfig::get("something_foo");
Avez-vous effacé vos fichiers de cache?
php symfony cc
dans l'environnement de production tous les fichiers de configuration, classes, etc... sont mis en cache.