我们开始在工作中采用Symfony 2,这很好,但我正在努力解决一个挑战,我几乎解决了,但还没完全解决。Symfony将环境的概念视为单个服务器上的单独运行时。这很棒,因为您可以随心所欲地使用不同的前端控制器(web)或使用env开关(cli)之间切换运行时。
但是,我们的代码作为开发流程的一部分部署在许多服务器上。每个人都有一个本地VM,然后代码通过Integration、QA、Staging最终传播到Production。
因此,我们对环境的概念是服务器(虚拟或物理)。以下是此自定义配置的目标:
1. 在运行时环境切换方面维护Symfony的ootb功能。 2. 允许每个服务器进行公共(即开发人员控制的)配置。 3. 维护每个服务器的私有(即系统管理员控制的)配置。 4. 希望适用于Web和CLI。
这意味着我们不能完全依赖于parameters.ini或任何静态命名文件,因为开发人员需要控制每个服务器的配置,而且所有这些文件都将位于git中的相邻位置。
因此,我想要做的是添加一个新值到parameters.ini,设置服务器环境。例如:app/config/parameters.ini
但是,我们的代码作为开发流程的一部分部署在许多服务器上。每个人都有一个本地VM,然后代码通过Integration、QA、Staging最终传播到Production。
因此,我们对环境的概念是服务器(虚拟或物理)。以下是此自定义配置的目标:
1. 在运行时环境切换方面维护Symfony的ootb功能。 2. 允许每个服务器进行公共(即开发人员控制的)配置。 3. 维护每个服务器的私有(即系统管理员控制的)配置。 4. 希望适用于Web和CLI。
这意味着我们不能完全依赖于parameters.ini或任何静态命名文件,因为开发人员需要控制每个服务器的配置,而且所有这些文件都将位于git中的相邻位置。
因此,我想要做的是添加一个新值到parameters.ini,设置服务器环境。例如:app/config/parameters.ini
[parameters]
server="int"
在内核中,根据该值加载额外的配置文件。例如,我希望这个工作但是它不起作用(因为容器在此步骤中尚不存在)。
app / 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这样的文件来控制非私有(即不是parameters.ini)配置值。
感谢阅读,如果有任何不清楚的地方请让我知道。
编辑
为了澄清,我不能使用或依赖以下内容:
- 来自用户配置文件或通过
export
的*nix环境变量。为什么?集成、QA和Staging都可能在同一台机器上。 - vhost配置中的任何内容(对cli无效)
- 静态命名的文件(即仅命名为server.ini之类的文件无法工作)
parse_ini_file
方法解析parameters.ini
。虽然我没有清楚地理解你的问题。你是说每个服务器配置文件都会有不同的路由/安全配置吗? - Mun Mun Das