配置Symfony(和環境)
Symfony程式是由一組「負責呈現全部功能和可能性」的bundles所構成。每個bundle都可以透過YAML、XML或PHP格式的設定檔進行自訂。預設的主力設定檔是在app/config/
目錄下,它可以是config.yml
、config.xml
或config.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%',)); // ...
在下面的環境小節中,你將會明確每種格式的檔案是如何被載入的。
每一個根節點,例如framework
或twig
,定義了對應bundle的設定資訊。例如,framework
鍵所定義的,是用於Symfony核心的FrameworkBundle之配置訊息,包括路由配置、模板配置以及其他核心配置。
現在,毋須擔心每個根節點下的特定設定選項。設定檔預先安裝了一些有意義的預設配置。當你詳細研讀和探索Symfony每一個部分時,你將會掌握每一個功能的特定配置選項之意義。
預設設定資訊的剝離 ¶
#你可以剝離指定bundle的YAML格式的預設設定訊息,透過命令列的config:dump-reference
指令。以下是剝離FrameworkBundle預設設定資訊的範例:
$ php bin/console config:dump-reference FrameworkBundle
擴充專用假名(設定檔中的根節點)也可以被使用:
$ php bin/console config:dump-reference framework
環境 ¶
一套程式可以運作在多種環境中。不同的環境,共享相同的PHP程式碼(除了前端控制器之外),但卻使用了不同的設定檔。例如,在dev
環境下將記錄警告和錯誤等級的日誌,但在prod
環境就只記錄錯誤訊息。在dev
環境下,有些檔案在每一次請求中都被重新建構(為了方便開發者),但到了prod
環境時卻被快取起來。所有的環境都在同一台機器下共存,並且執行相同的程序。
一般來說,一個Symfony專案有三個環境(dev
、test
和prod
),但創造一個新的環境是簡單的。你可以查看程式在不同環境下的執行效果,只需在瀏覽器中切換前端控制器。要看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
環境,都遵循相同的模型:每個環境先導入基本配置文件,然後調整其配置的值,以適合各自的特定環境。但這只是個約定,讓你可以重複使用設定檔中的大部分內容,再針對不同環境來自訂局部配置。