Symfony2 config.yml使用带参数的表达式

时间:2016-10-10 06:40:51

标签: symfony

是否可以在表达式中使用参数? 我在parameters.yml中有一个设置,我在其中定义了当前使用的环境,我想相应地调整所有配置。即我有一个数据库连接,我试图根据所使用的env设置ip(ip地址显然与真实地址不同):

$s = 'Cycle count Stored as a <a href="poem://plaspoem/POEM?LOC=MAIN&CMD=VIEW&KEY=CYCLE COUNT&REV=A">Cycle count</a> which is a count of records Cycle count';
echo "Approach 1: " . preg_match_all('~<a\b[^<]*?>[^<]*</a>(*SKIP)(?!)|\bcount\b~', $s) . "\n\nApproach 2: ";
echo preg_match_all('~\bcount\b(?![^<]*</a>)~', $s);

但是symfony给了我一个错误:

  

出了点问题。错误:SQLSTATE [HY000] [2002]   php_network_getaddresses:getaddrinfo失败:不可恢复的错误   在数据库查找期间发生。

我做错了什么但是什么?甚至可以在表达式中使用params,还是表达本身错了?

1 个答案:

答案 0 :(得分:1)

从Symfony 2.4 - 3.2开始回答您的具体问题; @=前缀用于加载带有字符串的an Expression object,并且编译器无法在parameters:上下文中转储。但可以在services:上下文中使用。

请参阅:bug report on github了解更多信息。

解决您的使用案例;最好使用特定于环境的配置,Symfony在documentation for creating new environments中的描述。

您的目录结构应如下所示。

app
   config
      config.yml
      config_dev.yml
      config_prod.yml
      config_prod1.yml
      config_stage.yml
      ....
      parameters.yml
web
   app.php
   app_dev.php
   app_prod1.php
   app_stage.php

config.yml旨在包含适用于所有环境的配置,服务和参数。

所有其他config_[environment].yml文件可以包含特定于环境的配置,服务和参数。这会略微改变基础config.yml值。

parameters.yml包含canonical parameter值,默认为altered,只要您运行php composer.phar install ,只要您将更新部署到生产环境,就应该这样做< / em>的。因此,最好将其保留为parameters.yml.dist文件,而不是手动更改。

为了加载特定的环境配置;默认情况下,Symfony会在容器编译期间自动尝试加载app/config/config_%kernel.environment%.yml文件。因此,特定于环境的配置加载已经存在。

php bin/console --env=prod1 --no-debug cache:warmup

请参阅AppKernel::registerContainerConfiguration方法。

$loader->load($this->getRootDir().'/config/config_'.$this->getEnvironment().'.yml');

但是,您需要configure your webserver指向所需的Web前端控制器文件。 app.phpapp_prod1.php等。他们告诉Symfony启动哪个应用环境并设置调试模式。

web/app.php复制到web/app_prod1.php并更改AppKernel加载的环境。

$kernel = new AppKernel('prod1', false);

Symfony Web服务器

php bin/console --env=prod1 server:run  

Apache /web/.htaccess

将第1行的DirectoryIndex更改为所需的环境

DirectoryIndex app_prod1.php

然后更改重写规则

RewriteRule .? %{ENV:BASE}/app_prod1.php [L]

RedirectMatch 302 ^/$ /app_prod1.php/

否则,请在VirtualHost文件中配置mod重写并禁用.htaccess以指向所需的环境。这对您的服务器环境非常主观(php-fpm,NginX等)。

一旦Web服务器加载了适当的环境,配置文件就可以级联,但这是可取的。

<强> config.yml

imports: 
    - { resource: parameters.yml }
    - { resource: security.yml }
    - { resource: services.yml }

framework:
    templating:
        engines: ['twig']
    form: ~

doctrine:
    dbal:
        host: %database_host%
#...

<强> config_prod1.yml

imports:
    - { resource: config.yml } #load the global/default settings

framework:
    form: { enabled: true } #enable the form setting while keeping all other values

#define environment specific services (usually best declared in a bundle)
services:
    app.my_service: '@service'

#override the parameters.yml setting loaded by config.yml or declare new ones
parameters:
    database_host: 192.168.1.2

<强>替代

  1. 将配置参数分开 parameters_%kernel.environment%.yml个文件并导入它们 单独到各自的环境配置文件。
  2. 使用捆绑包Extension to dynamically configure并加载自定义参数。
  3. 您还可以根据特定条件或系统环境变量将app.php配置为load different environments。但是,这在生产中不能很好地扩展,并且可能会导致某些缓存机制出现问题。