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.

18
demandé sur Guillaume Flandre 2010-03-30 14:56:01

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)

12
répondu Syam 2010-12-16 02:10:24

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

5
répondu naag 2010-04-06 13:33:28

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).

5
répondu wdev 2011-08-12 14:20:06

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
1
répondu Thorsten 2011-04-07 07:13:16

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");
1
répondu sredni 2012-08-28 13:17:27

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.

0
répondu martin 2010-04-07 07:50:56