我们开始采用Symfony 2进行工作中的项目,这很棒,但我正在努力解决这个问题,我差不多已经完成了,但并不完全。
Symfony将环境的概念视为单个服务器上的单独运行时。这很棒,因为你可以在不同前控制器(web)的运行时间之间切换,或者随意使用env开关(cli)。
但是,我们的代码作为开发过程的一部分部署在许多服务器上。每个人都有一个本地VM,然后代码通过Integration,QA,Staging和最终生产传播。
因此,我们的环境概念是服务器(虚拟或物理)。以下是此自定义配置的目标
这意味着我们不能100%依赖 parameters.ini 或任何静态命名的文件,因为开发人员需要控制每个服务器的配置以及所有这些文件将在git中与彼此生活在一起。
所以,我喜欢做的就是这个。向parameters.ini添加一个新值,用于设置服务器环境。像这样的东西
应用/配置/ 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');
}
}
这样可以使用开发人员可以用来控制非私有(即非参数.ini)配置值的文件,如 app / config / server / int.yml 。 / p>
感谢阅读,如果有什么问题让我知道。
为了澄清,我无法使用或依赖的内容
export
的环境变量。为什么?集成,质量检查和暂存可能都在同一个框中答案 0 :(得分:29)
好的,我终于想出了为此做些什么。真的只需要对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 );
}
}
}
应用/配置/ parameters.ini 强>
[parameters]
# ...
server.env="int"
server.title="Integration"
server.name="Int 1"
现在我可以根据需要在 app / config / server / 中创建%server.env%.yml 文件。
感谢那些读过这篇文章的人 - 我最初想的是一些更复杂的东西,这使得这个简单的解决方案在一段时间内不可见;)