配置Symfony(和环境)

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

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

Note

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

每一个根节点,比如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

Note

请参考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

Note

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

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

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

Note

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

Tip

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

环境配置

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

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

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

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

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

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

Keep Going!

了解更多

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