配置Symfony(和環境)


Symfony程式是由一組「負責呈現全部功能和可能性」的bundles所構成。每個bundle都可以透過YAML、XML或PHP格式的設定檔進行自訂。預設的主力設定檔是在app/config/目錄下,它可以是config.ymlconfig.xmlconfig.php,根據你的偏好而定:

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%',)); // ...

在下面的環境小節中,你將會明確每種格式的檔案是如何被載入的。

每一個根節點,例如frameworktwig,定義了對應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
##請參考cookbook文章如何在一個bunlde中加載服務的配置信息,來獲取“給你自己的bundle添加配置信息”的相關內容。

#

環境 ¶

一套程式可以運作在多種環境中。不同的環境,共享相同的PHP程式碼(除了前端控制器之外),但卻使用了不同的設定檔。例如,在dev環境下將記錄警告和錯誤等級的日誌,但在prod環境就只記錄錯誤訊息。在dev環境下,有些檔案在每一次請求中都被重新建構(為了方便開發者),但到了prod環境時卻被快取起來。所有的環境都在同一台機器下共存,並且執行相同的程序。

一般來說,一個Symfony專案有三個環境(devtestprod),但創造一個新的環境是簡單的。你可以查看程式在不同環境下的執行效果,只需在瀏覽器中切換前端控制器。要看dev環境,存取程式的開發版front controller:

localhost/app_dev.php/random/10

如果你要看程式在生產環境下的執行情況,換上prod版前端控制器:

localhost/app_dev.php/random/10

prod環境專為速度最佳化,配置資訊、路由和Twig模板都會編譯成原生php類別並且快取起來。當需要查看prod環境下的改變時,你需要清除這些快取檔案然後重構它們:

$  php bin/console cache:clear --env=prod --no-debug

如果你打開web/app. php文件,你可以看到prod環境被明確地配置好了:

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

你可以為一個新環境創建一個新的前端控制器,拷貝上面這行程式碼並將prod換成別的值。

test環境被用於自動測試(automatic testing),不能透過瀏覽器直接存取。參考「框架指南」中的測試章節以了解更多。

當使用server:run指令來啟動server時,localhost:8000/使用的是你程式中的dev前端控制器。

#

環境設定 

AppKernel類別負責載入你指定的設定檔:

// app/AppKernel.phppublic function registerContainerConfiguration(LoaderInterface $loader){
    $loader->load(
        __DIR__.'/config/config_'.$this->getEnvironment().'.yml'
    );}

你已經知道.yml後綴可以改為.xml.php,如果你願意使用XML或PHP來完成設定的話。注意每種環境載入的是它自己的設定檔。看一下dev環境下的設定檔:

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)被先載入。本文件的剩餘部分,用於調整預設配置,強化日誌功能和其他一些利於開發環境的設定。

不管是prod還是test環境,都遵循相同的模型:每個環境先導入基本配置文件,然後調整其配置的值,以適合各自的特定環境。但這只是個約定,讓你可以重複使用設定檔中的大部分內容,再針對不同環境來自訂局部配置。


#