配置Symfony(和环境)
Symfony程序是由一组“负责呈现全部功能和可能性”的bundles所构成。每个bundle都可以通过YAML、XML或PHP格式的配置文件进行自定义。默认的主力配置文件是在app/config/
目录下,它可以是config.yml
、config.xml
或config.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%',
));
// ... |
在下面的环境小节中,你将会明确每种格式的文件是如何被加载的。
每一个根节点,比如framework
或twig
,定义了相应bundle的配置信息。例如,framework
键所定义的,是用于Symfony核心的FrameworkBundle之配置信息,包括路由配置、模板配置以及其他内核配置。
现在,毋须担心每个根节点下的特定配置选项。配置文件预装了一些有意义的默认配置。当你详细研读和探索Symfony每一个部分时,你将会掌握每一个功能的特定配置选项之意义。
默认配置信息的剥离 ¶
你可以剥离出指定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项目有三种环境(dev
、test
和prod
),但创建一种新的环境是简单的。你可以查看程序在不同环境下的执行效果,只需在浏览器中切换前端控制器。要看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! ¶
表单
数据库和Doctrine
服务容器
Security
如何发送邮件
使用Monolog做记录