Подтвердить что ты не робот

Как создать пользовательский конфигурационный файл yaml в Symfony

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

Я создал свой файл 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.

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

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

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

Это очень просто, но и немного взломано:

Создайте файл /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();

Btw: Это также указано в документации, которую вы указали, хотя вызов checkConfig() находится в другом месте. Посмотрите на это: "Когда вам нужен код, основанный на файле map.yml и сгенерированный обработчиком myMapConfigHandler в вашем приложении, вызовите следующую строку:"

Удачи, -)

Ответ 3

Если вы делаете это для плагина, вам нужно загрузить файл конфигурации в метод initialize(). Вы все равно можете использовать 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'));
    }
  }
}

Метод initialize() метода plugin автоматически вызывается классом sfProjectConfiguration и всеми классами appConfiguration (наследование корыта).

Ответ 4

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

как:

all:
  test:  value1
  test2: value2

dev:
  test2: value3

Ответ 5

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

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

Затем вы можете использовать:

sfConfig::get("something_foo");

Ответ 6

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

php symfony cc

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