Как создать пользовательский конфигурационный файл 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()
, но я хотел бы сделать что-то лучше.
Ответы
Ответ 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 все файлы конфигурации, классы и т.д. кэшируются.