Мы начинаем принимать Symfony 2 для проектов здесь, на работе, это здорово, но есть проблема, над которой я работаю, чтобы решить, что я почти получил, но не совсем.
Symfony рассматривает концепцию среды как отдельную среду выполнения на одном сервере. Это здорово, потому что вы можете переключаться между режимами работы с разными передними контроллерами (web) или с помощью переключателя env (cli) по прихоти.
Однако наш код развертывается на многих серверах как часть процесса разработки. У каждого есть локальная виртуальная машина, затем код распространяется через интеграцию, QA, Staging и, наконец, Production.
Итак, наша концепция среды – это сервер (виртуальный или физический). Вот цели с этой настраиваемой конфигурацией
Это означает, что мы не можем только 100% полагаться на parameters.ini или на любой статически именованный файл, поскольку разработчик должен будет контролировать конфигурацию для каждого сервера, и все эти файлы будут жить рядом с eachother в git.
Итак, я бы хотел сделать это. Добавьте новое значение в параметры.ini, который устанавливает серверную среду. Что-то вроде этого
приложение / Config / parameters.ini
[parameters] server="int"
И затем в ядре загрузите дополнительный файл конфигурации на основе этого значения. Например, мне бы хотелось, чтобы это работало, но это не так (поскольку на этом этапе контейнер еще не существует)
Приложение / AppKernel.php
public function registerContainerConfiguration(LoaderInterface $loader) { $loader->load(__DIR__.'/config/config_'.$this->getEnvironment().'.yml'); // Per-server config $server = $this->getContainer()->getParameter( 'server' ); if ( $server ) { $loader->load(__DIR__.'/config/server/'.$server.'.yml'); } }
Это позволит использовать файл, такой как app / config / server / int.yml, который разработчик может использовать для управления значениями, не относящимися к частным (т.е. не параметрам.ini).
Спасибо за чтение и дайте мне знать, если что-то сбивает с толку.
Для уточнения вещей, которые я не могу использовать или полагаться на
export
. Зачем? Интеграция, QA и Staging могут быть в одной коробке Хорошо, я наконец понял, что делать для этого. На самом деле просто требуется базовая модификация AppKernel
Приложение / AppKernel.php
public function registerContainerConfiguration(LoaderInterface $loader) { // Symfony environment config $loader->load(__DIR__.'/config/config_'.$this->getEnvironment().'.yml'); // Load server config, if it exists $parameters = parse_ini_file( __DIR__.'/config/parameters.ini', true ); if ( $parameters && isset( $parameters['parameters']['server.env'] ) ) { $serverConfig = __DIR__.'/config/server/'.$parameters['parameters']['server.env'].'.yml'; if ( file_exists( $serverConfig ) ) { $loader->load( $serverConfig ); } else { error_log( 'Server config defined, but no config file found. Looked for ' . $serverConfig ); } } }
приложение / Config / parameters.ini
[parameters] # ... server.env="int" server.title="Integration" server.name="Int 1"
И теперь я могу просто создать % server.env% .yml- файлов в app / config / server / по мере необходимости.
Спасибо тем, кто читал это – я изначально думал о чем-то гораздо более сложном, что заставило это простое решение невидимым на некоторое время;)