Как создать пользовательский файл конфигурации yaml в Symfony - PullRequest
18 голосов
/ 30 марта 2010

То, что я хочу сделать, довольно просто: сохранить данные в пользовательском файле конфигурации, который я хочу прочитать позже.

Я создал свой файл something.yml, который поместил в глобальный каталог config. Это выглядит так:

prod:
  test:  ok

dev:
  test: ko

all:
  foo:  bar
  john: doe

Затем я скопировал файл config_handlers.yml, а также поместил его в каталог конфигурации и добавил в начало файла следующее:

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

Но если я звоню sfConfig::get("something_foo");, я продолжаю получать NULL.

Что я сделал не так? Я просто хочу прочитать значения, так что не нужно создавать обработчик конфигурации customme, верно?

Я прочитал документ здесь: http://www.symfony -project.org / book / 1_2 / 19-Mastering-Symfony-s-Configuration-Files , хотя я использую 1.4 (я не не думаю, что изменилось с тех пор).

Редактировать: Конечно, я могу использовать sfYaml::load(), но я бы хотел сделать что-то лучше.

Ответы [ 6 ]

12 голосов
/ 16 декабря 2010

Не изменяйте index.php, это грязно!

Juste добавьте эту строку в ваше приложение / frontend / config / frontendConfiguration.class.php

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

(адаптировать под собственное имя приложения)

5 голосов
/ 12 августа 2011

Если вы делаете это для плагина , вам нужно загрузить файл конфигурации в методе initialize (). Вы все еще можете использовать config_handlers.yml в директории config вашего плагина или позволить плагину загрузить обработчик тоже.

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 (через наследование).

5 голосов
/ 06 апреля 2010

Это действительно легко, но немного хакерски:

Создайте файл /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 в вашем приложении, вызовите следующую строку:»

Веселись; -)

1 голос
/ 28 августа 2012

Работает во всех файлах приложения:

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

Тогда вы можете использовать:

sfConfig::get("something_foo");
1 голос
/ 07 апреля 2011

если ваш кешированный конфигурационный файл пуст, вы, вероятно, забыли установить среду в своем yml-файле.

как:

all:
  test:  value1
  test2: value2

dev:
  test2: value3
0 голосов
/ 07 апреля 2010

Вы очистили файлы кэша?

php symfony cc

В производственной среде все конфигурационные файлы, классы и т. Д ... кэшируются.

...