配置Symfony(和環(huán)境)
Symfony程序是由一組“負(fù)責(zé)呈現(xiàn)全部功能和可能性”的bundles所構(gòu)成。每個(gè)bundle都可以通過(guò)YAML、XML或PHP格式的配置文件進(jìn)行自定義。默認(rèn)的主力配置文件是在app/config/
目錄下,它可以是config.yml
、config.xml
或config.php
,根據(jù)你的偏好而定:
YAML:# app/config/config.ymlimports: - { resource: parameters.yml } - { resource: security.yml }framework: secret: "%secret%" router: { resource: "%kernel.root_dir%/config/routing.yml" } # ... # Twig Configurationtwig: debug: "%kernel.debug%" strict_variables: "%kernel.debug%" # ...
XML:<!-- 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>
PHP:// 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%',)); // ...
在下面的環(huán)境小節(jié)中,你將會(huì)明確每種格式的文件是如何被加載的。
每一個(gè)根節(jié)點(diǎn),比如framework
或twig
,定義了相應(yīng)bundle的配置信息。例如,framework
鍵所定義的,是用于Symfony核心的FrameworkBundle之配置信息,包括路由配置、模板配置以及其他內(nèi)核配置。
現(xiàn)在,毋須擔(dān)心每個(gè)根節(jié)點(diǎn)下的特定配置選項(xiàng)。配置文件預(yù)裝了一些有意義的默認(rèn)配置。當(dāng)你詳細(xì)研讀和探索Symfony每一個(gè)部分時(shí),你將會(huì)掌握每一個(gè)功能的特定配置選項(xiàng)之意義。
默認(rèn)配置信息的剝離 ?
你可以剝離出指定bundle的YAML格式的默認(rèn)配置信息,通過(guò)命令行的config:dump-reference
命令。以下是剝離FrameworkBundle默認(rèn)配置信息的例子:
$ php bin/console config:dump-reference FrameworkBundle
擴(kuò)展專用假名(配置文件中的根節(jié)點(diǎn))也可以被使用:
$ php bin/console config:dump-reference framework
請(qǐng)參考cookbook文章如何在一個(gè)bunlde中加載服務(wù)的配置信息,來(lái)獲取“給你自己的bundle添加配置信息”的相關(guān)內(nèi)容。
環(huán)境 ?
一套程序可以運(yùn)行在多種環(huán)境中。不同的環(huán)境,共享著相同的PHP代碼(除了前端控制器之外),但卻使用了不同的配置文件。例如,在dev
環(huán)境下將記錄警告和錯(cuò)誤級(jí)別的日志,但在prod
環(huán)境就只記錄錯(cuò)誤信息。在dev
環(huán)境下,有些文件在每一次請(qǐng)求中都被重新構(gòu)建(為了方便開(kāi)發(fā)者),但到了prod
環(huán)境時(shí)卻被緩存起來(lái)。所有的環(huán)境都在同一機(jī)器下共存,并且執(zhí)行相同的程序。
一般來(lái)說(shuō),一個(gè)Symfony項(xiàng)目有三種環(huán)境(dev
、test
和prod
),但創(chuàng)建一種新的環(huán)境是簡(jiǎn)單的。你可以查看程序在不同環(huán)境下的執(zhí)行效果,只需在瀏覽器中切換前端控制器。要看dev
環(huán)境,訪問(wèn)程序的開(kāi)發(fā)版front controller:
localhost/app_dev.php/random/10
如果你要看看程序在生產(chǎn)環(huán)境下的執(zhí)行情況,換上prod
版前端控制器:
localhost/app_dev.php/random/10
prod
環(huán)境專為速度優(yōu)化,配置信息、路由和Twig模板都被編譯成原生php類并緩存起來(lái)。當(dāng)需要查看prod
環(huán)境下的改變時(shí),你需要清除這些緩存文件然后重構(gòu)它們:
$ php bin/console cache:clear --env=prod --no-debug
如果你打開(kāi)web/app.php
文件,你可以看到prod
環(huán)境被顯式地配置好了:
$kernel = new AppKernel('prod', false);
你可以為一個(gè)新環(huán)境創(chuàng)建一個(gè)新的前端控制器,拷貝上面這行代碼并將prod
換成別的值。
test
環(huán)境被用于自動(dòng)測(cè)試(automatic testing),不能通過(guò)瀏覽器直接訪問(wèn)。參考“框架指南”中的測(cè)試章節(jié)了解更多。
當(dāng)使用server:run
命令來(lái)啟動(dòng)server時(shí),localhost:8000/
使用的是你程序中的dev前端控制器。
環(huán)境配置 ?
AppKernel
類負(fù)責(zé)加載你指定的配置文件:
// app/AppKernel.phppublic function registerContainerConfiguration(LoaderInterface $loader){ $loader->load( __DIR__.'/config/config_'.$this->getEnvironment().'.yml' );}
你已經(jīng)知道.yml
后綴可以被改為.xml
或.php
,如果你愿意使用XML或PHP來(lái)完成配置的話。注意每種環(huán)境加載的是它自己的配置文件??匆幌?code>dev環(huán)境下的配置文件:
YAML:# app/config/config_dev.ymlimports: - { resource: config.yml }framework: router: { resource: "%kernel.root_dir%/config/routing_dev.yml" } profiler: { only_exceptions: false } # ...
XML:<!-- 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>
PHP:// 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
)被首先加載。本文件的剩余部分,用于調(diào)整默認(rèn)配置,強(qiáng)化日志功能和其他一些利于開(kāi)發(fā)環(huán)境的設(shè)定。
不管是prod
還是test
環(huán)境,都遵循相同的模型:每種環(huán)境先導(dǎo)入基本配置文件,然后調(diào)整其配置的值,以適合各自的特定環(huán)境。但這只是個(gè)約定,讓你可以復(fù)用配置文件中的大部分內(nèi)容,再針對(duì)不同環(huán)境來(lái)自定義局部配置。