配置Symfony(和环境)

Symfony程序是由一组“负责呈现全部功能和可能性”的bundles所构成。每个bundle都可以通过YAML、XML或PHP格式的配置文件进行自定义。默认的主力配置文件是在app/config/目录下,它可以是config.ymlconfig.xmlconfig.php,根据你的偏好而定:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# app/config/config.yml
imports:
    - { resource: parameters.yml }
    - { resource: security.yml }

framework:
    secret:          "%secret%"
    router:          { resource: "%kernel.root_dir%/config/routing.yml" }
    # ...
 
# Twig Configuration
twig:
    debug:            "%kernel.debug%"
    strict_variables: "%kernel.debug%"
 
# ...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<!-- app/config/config.xml -->
<?xml version="1.0" encoding="UTF-8" ?>
<container xmlns="http://symfony.com/schema/dic/services"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:framework="http://symfony.com/schema/dic/symfony"
    xmlns:twig="http://symfony.com/schema/dic/twig"
    xsi:schemaLocation="http://symfony.com/schema/dic/services
        http://symfony.com/schema/dic/services/services-1.0.xsd
        http://symfony.com/schema/dic/symfony
        http://symfony.com/schema/dic/symfony/symfony-1.0.xsd
        http://symfony.com/schema/dic/twig
        http://symfony.com/schema/dic/twig/twig-1.0.xsd">
 
    <imports>
        <import resource="parameters.yml" />
        <import resource="security.yml" />
    </imports>
 
    <framework:config secret="%secret%">
        <framework:router resource="%kernel.root_dir%/config/routing.xml" />
        <!-- ... -->
    </framework:config>
 
    <!-- Twig Configuration -->
    <twig:config debug="%kernel.debug%" strict-variables="%kernel.debug%" />
 
    <!-- ... -->
</container>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// app/config/config.php
$this->import('parameters.yml');
$this->import('security.yml');
 
$container->loadFromExtension('framework', array(
    'secret' => '%secret%',
    'router' => array(
        'resource' => '%kernel.root_dir%/config/routing.php',
    ),
    // ...
));
 
// Twig Configuration
$container->loadFromExtension('twig', array(
    'debug'            => '%kernel.debug%',
    'strict_variables' => '%kernel.debug%',
));
 
// ...

在下面的环境小节中,你将会明确每种格式的文件是如何被加载的。

每一个根节点,比如frameworktwig,定义了相应bundle的配置信息。例如,framework键所定义的,是用于Symfony核心的FrameworkBundle之配置信息,包括路由配置、模板配置以及其他内核配置。

现在,毋须担心每个根节点下的特定配置选项。配置文件预装了一些有意义的默认配置。当你详细研读和探索Symfony每一个部分时,你将会掌握每一个功能的特定配置选项之意义。

配置文件的

本章的全部配置信息例程,都将以三种格式展示(YAML、XML和PHP)。每种各有短长,全凭你来选择:

  • YAML:简单、清楚、可读性强。(通过YAML组件了解更多)

  • XML:某些时候比YAML威力强大,而且支持IDE的代码自动完成。

  • PHP:非常强大,但相比标准配置格式缺乏可读性。

默认配置信息的剥离 

你可以剥离出指定bundle的YAML格式的默认配置信息,通过命令行的config:dump-reference命令。以下是剥离FrameworkBundle默认配置信息的例子:

1
$  php bin/console config:dump-reference FrameworkBundle

扩展专用假名(配置文件中的根节点)也可以被使用:

1
$  php bin/console config:dump-reference framework

请参考cookbook文章如何在一个bunlde中加载服务的配置信息,来获取“给你自己的bundle添加配置信息”的相关内容。

环境 

一套程序可以运行在多种环境中。不同的环境,共享着相同的PHP代码(除了前端控制器之外),但却使用了不同的配置文件。例如,在dev环境下将记录警告和错误级别的日志,但在prod环境就只记录错误信息。在dev环境下,有些文件在每一次请求中都被重新构建(为了方便开发者),但到了prod环境时却被缓存起来。所有的环境都在同一机器下共存,并且执行相同的程序。

一般来说,一个Symfony项目有三种环境(devtestprod),但创建一种新的环境是简单的。你可以查看程序在不同环境下的执行效果,只需在浏览器中切换前端控制器。要看dev环境,访问程序的开发版front controller:

1
http://localhost/app_dev.php/random/10

如果你要看看程序在生产环境下的执行情况,换上prod版前端控制器:

1
http://localhost/app_dev.php/random/10

prod环境专为速度优化,配置信息、路由和Twig模板都被编译成原生php类并缓存起来。当需要查看prod环境下的改变时,你需要清除这些缓存文件然后重构它们:

1
$  php bin/console cache:clear --env=prod --no-debug

如果你打开web/app.php文件,你可以看到prod环境被显式地配置好了:

1
$kernel = new AppKernel('prod', false);

你可以为一个新环境创建一个新的前端控制器,拷贝上面这行代码并将prod换成别的值。

test环境被用于自动测试(automatic testing),不能通过浏览器直接访问。参考“框架指南”中的测试章节了解更多。

当使用server:run命令来启动server时,http://localhost:8000/使用的是你程序中的dev前端控制器。

环境配置 

AppKernel类负责加载你指定的配置文件:

1
2
3
4
5
6
7
// app/AppKernel.php
public function registerContainerConfiguration(LoaderInterface $loader)
{
    $loader->load(
        __DIR__.'/config/config_'.$this->getEnvironment().'.yml'
    );
}

你已经知道.yml后缀可以被改为.xml.php,如果你愿意使用XML或PHP来完成配置的话。注意每种环境加载的是它自己的配置文件。看一下dev环境下的配置文件:

1
2
3
4
5
6
7
8
9
# app/config/config_dev.yml
imports:
    - { resource: config.yml }

framework:
    router:   { resource: "%kernel.root_dir%/config/routing_dev.yml" }
    profiler: { only_exceptions: false }
 
# ...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<!-- app/config/config_dev.xml -->
<?xml version="1.0" encoding="UTF-8" ?>
<container xmlns="http://symfony.com/schema/dic/services"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:framework="http://symfony.com/schema/dic/symfony"
    xsi:schemaLocation="http://symfony.com/schema/dic/services
        http://symfony.com/schema/dic/services/services-1.0.xsd
        http://symfony.com/schema/dic/symfony
        http://symfony.com/schema/dic/symfony/symfony-1.0.xsd">
 
    <imports>
        <import resource="config.xml" />
    </imports>
 
    <framework:config>
        <framework:router resource="%kernel.root_dir%/config/routing_dev.xml" />
        <framework:profiler only-exceptions="false" />
    </framework:config>
 
    <!-- ... -->
</container>
1
2
3
4
5
6
7
8
9
10
11
// app/config/config_dev.php
$loader->import('config.php');
 
$container->loadFromExtension('framework', array(
    'router' => array(
        'resource' => '%kernel.root_dir%/config/routing_dev.php',
    ),
    'profiler' => array('only-exceptions' => false),
));
 
// ...

import根键,类似于PHP的include声明,确保主力配置文件(config.yml)被首先加载。本文件的剩余部分,用于调整默认配置,强化日志功能和其他一些利于开发环境的设定。

不管是prod还是test环境,都遵循相同的模型:每种环境先导入基本配置文件,然后调整其配置的值,以适合各自的特定环境。但这只是个约定,让你可以复用配置文件中的大部分内容,再针对不同环境来自定义局部配置。

Keep Going! 

本文,包括例程代码在内,采用的是 Creative Commons BY-SA 3.0 创作共用授权。

登录symfonychina 发表评论或留下问题(我们会尽量回复)