配置Symfony(和环境)
Symfony程序是由一组“负责呈现全部功能和可能性”的bundles所构成。每个bundle都可以通过YAML、XML或PHP格式的配置文件进行自定义。默认的主力配置文件是在app/config/
目录下,它可以是config.yml
、config.xml
或config.php
,根据你的偏好而定:
- # 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%"
- # ...
- <!-- 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>
- // 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%',
- ));
- // ...
Note
在下面的环境小节中,你将会明确每种格式的文件是如何被加载的。
每一个根节点,比如framework
或twig
,定义了相应bundle的配置信息。例如,framework
键所定义的,是用于Symfony核心的FrameworkBundle之配置信息,包括路由配置、模板配置以及其他内核配置。
现在,毋须担心每个根节点下的特定配置选项。配置文件预装了一些有意义的默认配置。当你详细研读和探索Symfony每一个部分时,你将会掌握每一个功能的特定配置选项之意义。
配置文件的
本章的全部配置信息例程,都将以三种格式展示(YAML、XML和PHP)。每种各有短长,全凭你来选择:
YAML:简单、清楚、可读性强。(通过YAML组件了解更多)
XML:某些时候比YAML威力强大,而且支持IDE的代码自动完成。
PHP:非常强大,但相比标准配置格式缺乏可读性。
默认配置信息的剥离
你可以剥离出指定bundle的YAML格式的默认配置信息,通过命令行的config:dump-reference
命令。以下是剥离FrameworkBundle默认配置信息的例子:
- $ php bin/console config:dump-reference FrameworkBundle
扩展专用假名(配置文件中的根节点)也可以被使用:
- $ php bin/console config:dump-reference framework
Note
请参考cookbook文章如何在一个bunlde中加载服务的配置信息,来获取“给你自己的bundle添加配置信息”的相关内容。
环境
一套程序可以运行在多种环境中。不同的环境,共享着相同的PHP代码(除了前端控制器之外),但却使用了不同的配置文件。例如,在dev
环境下将记录警告和错误级别的日志,但在prod
环境就只记录错误信息。在dev
环境下,有些文件在每一次请求中都被重新构建(为了方便开发者),但到了prod
环境时却被缓存起来。所有的环境都在同一机器下共存,并且执行相同的程序。
一般来说,一个Symfony项目有三种环境(dev
、test
和prod
),但创建一种新的环境是简单的。你可以查看程序在不同环境下的执行效果,只需在浏览器中切换前端控制器。要看dev
环境,访问程序的开发版front controller:
- http://localhost/app_dev.php/random/10
如果你要看看程序在生产环境下的执行情况,换上prod
版前端控制器:
- http://localhost/app_dev.php/random/10
prod
环境专为速度优化,配置信息、路由和Twig模板都被编译成原生php类并缓存起来。当需要查看prod
环境下的改变时,你需要清除这些缓存文件然后重构它们:
- $ php bin/console cache:clear --env=prod --no-debug
Note
如果你打开web/app.php
文件,你可以看到prod
环境被显式地配置好了:
- $kernel = new AppKernel('prod', false);
你可以为一个新环境创建一个新的前端控制器,拷贝上面这行代码并将prod
换成别的值。
Note
test
环境被用于自动测试(automatic testing),不能通过浏览器直接访问。参考“框架指南”中的测试章节了解更多。
Tip
当使用server:run
命令来启动server时,http://localhost:8000/
使用的是你程序中的dev前端控制器。
环境配置
AppKernel
类负责加载你指定的配置文件:
- // app/AppKernel.php
- public function registerContainerConfiguration(LoaderInterface $loader)
- {
- $loader->load(
- __DIR__.'/config/config_'.$this->getEnvironment().'.yml'
- );
- }
你已经知道.yml
后缀可以被改为.xml
或.php
,如果你愿意使用XML或PHP来完成配置的话。注意每种环境加载的是它自己的配置文件。看一下dev
环境下的配置文件:
- # app/config/config_dev.yml
- imports:
- - { resource: config.yml }
- framework:
- router: { resource: "%kernel.root_dir%/config/routing_dev.yml" }
- profiler: { only_exceptions: false }
- # ...
- <!-- 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>
import
根键,类似于PHP的include
声明,确保主力配置文件(config.yml
)被首先加载。本文件的剩余部分,用于调整默认配置,强化日志功能和其他一些利于开发环境的设定。
不管是prod
还是test
环境,都遵循相同的模型:每种环境先导入基本配置文件,然后调整其配置的值,以适合各自的特定环境。但这只是个约定,让你可以复用配置文件中的大部分内容,再针对不同环境来自定义局部配置。
Keep Going!
了解更多
- 在Dependency Injection类里使用参数
- 如何在服务容器中设置外部参数
- 如何覆写Symfony的默认目录结构
- 如何组织配置文件
- 如何掌握创建新的环境
- 使用MicroKernelTrait创建你自己的微框架
- 理解前端控制器、Kernel以及环境是如何一起工作的
本文,包括例程代码在内,采用的是 Creative Commons BY-SA 3.0 创作共用授权。