2019年3月25日 星期一

Symfony4.2入門教學【第六篇】設定(Configuration)


Symfony可以安裝第三方套件(程序包、libraries等等),為專案帶來新的功能(service),透過預設放在目錄config/的設定檔案可以客製每一個套件。

Configuration: config/packages/

所有套件的設定都可以在config/packages/找到。舉例來說,framework程序包的設定檔案在config/packages/framework.yaml
// 省略程式碼
最上層的鍵(key)(這邊指的是framework)會是針對特定程序包的設定(這個例子裡指的是FrameworkBundle)。

設定檔格式
這份文章裡所有的設定檔例子都會有三種格式(YAML, XML and PHP),預設會使用YAML,但你可以選擇你最喜歡的來用,它們的效能表現沒有差別:
  • YAML格式: 簡單、整潔且可讀性高。
  • XML: 相較於YAML,在times和IDE autocompletion的支援度較高。
  • PHP: 非常強大,但相較於標準的設定格式,可讀性較低。

配置參考(Configuration Reference)和Dumping

有兩個方法可以知道有哪些鍵(key)可以設置:
  1. 查看『參考』(原文)這個章節
  2. 使用指令config:dump-reference
舉例來說,如何想要設定關於framework程序包,透過下列指令,你可以看到所有可用的選項羅列出來:
php bin/console config:dump-reference framework


The parameters Key: Parameters (Variables)

配置文件中最特別的最上層鍵,一種被稱為parameters,用來定義可以被其他設定檔引用的變數(variables),例如,當你安裝一個translation套件,一個locale的parameter就會被加在檔案config/services.yaml內。
// 省略程式碼
這個parameter在framework的設定檔(config/packages/translation.yaml)裡可以參考(reference):
// 省略程式碼
在設定檔內,你可以在parameters鍵底下定義任何想要的參數名稱(parameter name),若要參考parameter,在名稱的兩個加上百分比的符號 - 如:%locale%

你可以動態的設定參數,像是環境變數,請看『How to Set external Parameters in the Service Container

想要知道更多關於參數的資訊 - 包含如何在控制器裡參考這些參數 - 請看服務參數(原文)。

檔案.env和環境變數
載入檔案.env的內容成為環境變數(environment variables),在開發階段的時候,或設定環境變數對你來說很困難,都很方便。

當你安裝套件時,更多的環境變數會加到這個檔案,當然你還是可以新增自己所需要的。

透過特定的語句,在其他設定檔都可以引用環境變數。舉例來說,如果你安裝doctrine套件,檔案.env裡會多一個環境變數叫DATABASE_URL,在檔案config/packages/doctrine.yaml裡可以這樣引用參數:
# config/packages/doctrine.yaml
doctrine:
    dbal:
        url: '%env(DATABASE_URL)%'

        # The `resolve:` prefix replaces container params by their values inside the env variable:
        # url: '%env(resolve:DATABASE_URL)%'
若要取得更多關於環境變數的訊息,請看『環境變數』(原文)。

在2018年11月以前建立的專案,系統作了些微的調整,涉及檔案.env.dist,若要了解關於升級的資訊,請看『Nov 2018 Changes to .env & How to Update

檔案.env很特殊,因為它通常定義了在每個伺服器上需要更改的值,例如你本地端的開發環境,資料庫設定肯定和你的同事不同,檔案.env內包含所有環境變數之敏感、無法隱藏的默認值,且應該提交到你的儲存庫(Repository)。

如果要複寫這些根據伺服器或屬於敏感資料的環境變數,可以新建一個檔案.env.local,這將不會上傳到共享的儲存庫。事實上,Symfony自動產生的檔案.gitignore,避免將這些檔案上傳。

你也可以新增一些其他.env,一樣會被載入使用:
  • .env.{environment}: 例如.env.test將會在環境test載入使用,並上傳。
  • .env.{environment}.local: 例如.env.prod.local會在prod環境內載入,但不會上傳到儲存庫。
如果你打算在正式環境中設定正確的環境變數,.env仍然會載入,但你本地端的環境變數會覆蓋掉這些值。


環境&其他設定檔

你有一個應用程式,但不管你有沒有發覺,你需要讓他在不同的時候有不同的表現:
  • 開發(developing)時,你會希望應用程式會紀錄所有內容並顯示在漂亮的除錯工具上。
  • 在部屬到正式(production)環境後,你會希望應用程式在速度方便達到最佳化,且只需要顯示錯誤訊息。
如何讓一個應用程式有兩種不同的表現呢?正確答案是環境(environment)

你可能根本不知道dev環境是什麼就已經在使用了,在你部屬之後,你將會使用prod這個環境。

若要了解更多關於執行和控制每一個環境,請看『如何掌握和建立新環境』(原文)。


繼續前進!

恭喜!你已經了解基礎的Symfony,接著,按照指南了解Symfony的每個部分。查看:

還有更多主題

閱讀更多



文章原文:
https://symfony.com/doc/4.2/configuration.html

系列文章:

沒有留言:

張貼留言