如何在Symfony中创建自定义yaml配置文件

时间:2010-03-30 10:56:02

标签: symfony1 configuration-files yaml symfony-1.4

我想要做的很简单:将数据存储在我想要稍后阅读的自定义配置文件中。

我创建了我放在全局something.yml目录中的文件config。 它看起来像是:

prod:
  test:  ok

dev:
  test: ko

all:
  foo:  bar
  john: doe

然后我复制了config_handlers.yml并将其放在config目录中,并在文件顶部添加了以下内容:

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

但如果我正在致电sfConfig::get("something_foo");,我会继续NULL

我做错了什么? 我只想读取值,所以不需要创建一个自定义配置处理程序,对吗?

我已经阅读了这里的文档:http://www.symfony-project.org/book/1_2/19-Mastering-Symfony-s-Configuration-Files即使我正在运行1.4(我认为从那以后我没有改变)。

编辑:我当然可以使用sfYaml::load(),但我想以更好的方式做事。

6 个答案:

答案 0 :(得分:12)

不要修改index.php这很脏!

Juste将此行添加到您的app / frontend / config / frontendConfiguration.class.php

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

(适应您自己的应用名称)

答案 1 :(得分:5)

这很容易,但也有点hacky:

创建文件/config/config_handlers.yml并添加:

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

然后在/web/index.php之后将这两行添加到... getApplicationConfiguration()(并将它们添加到frontend_dev.php以及您希望此配置文件可用的任何位置):

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

所以你的/web/index.php之后可能会这样:

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

顺便说一句:这也在你引用的文档中,尽管checkConfig()调用位于不同的地方。请查看:“当您需要基于map.yml文件的代码并由应用程序中的myMapConfigHandler处理程序生成时,请调用以下行:”

玩得开心; - )

答案 2 :(得分:5)

如果你正在为插件执行 ,则需要在initialize()方法中加载配置文件。您仍然可以在插件的config目录中使用config_handlers.yml,或者让插件加载处理程序。

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

插件的config initialize()方法由sfProjectConfiguration类和所有appConfiguration类自动调用(通过继承)。

答案 3 :(得分:1)

如果您的缓存配置文件为空,您可能忘记在yml文件中设置环境。

像:

all:
  test:  value1
  test2: value2

dev:
  test2: value3

答案 4 :(得分:1)

适用于所有应用程序文件:

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

然后你可以使用:

sfConfig::get("something_foo");

答案 5 :(得分:0)

您是否清除了缓存文件?

php symfony cc

在生产环境中,所有配置文件,类等都在缓存中。