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