symfony權威指南(3)之symfony配置

在開始閱讀本文之前建議先閱讀筆者之前的一篇博文 yaml文件的語法及注意事項,瞭解一些關於yaml方面的相關知識。

第一次接觸symfony的人可能會不太習慣symfony的配置文件,因爲symfony的配置文件實在是太多了,而且還分了很多的層級,不過相信隨着後期學習的深入,你會瞭解到symfony的這些配置文件給開發帶來了很大的靈活性,利大於弊。

一、配置

1、項目配置(project)

項目相關的配置文件存放在項目根目錄下的config目錄下,如下截圖所示:


各個配置文件的相關說明:

databases.yml:該文件主要用來存放數據庫連接設置,可以被應用程序級的配置覆蓋

properties.ini:這個文件存放命令行工具需要的參數,包括項目名稱,遠程服務器的連接設置

rsync_exclude.txt:這個文件定義同步服務器的時候哪些文件不需要同步

schema.yml 與 propel.ini:這兩個文件是Propel(symfony 的ORM 層)的數據訪問配置文件。它們用來使Propel 與symfony 的類還有項目的數據協同工作。propel.ini 是自動生成的,所以你不用修改它。如果你不用Propel,就不需要這些文件。


2、應用程序配置(apps)

相關應用程序的配置文件存放在應用程序下的config目錄下,如下圖所示:


各個配置文件的相關說明:

app.yml:這個文件存放應用程序相關的配置信息,包括定義業務或者程序邏輯的全局變量,這些都不需要存放在數據庫裏。稅率,運費,e-mail地址等經常存放在這個文件。這個文件默認是空的。

factories.yml:symfony 在這裏定義處理視圖、請求、迴應、會話(session)等的類。如果你想用你自己的類取代symfony 的類,你可以在這裏定義它們。

filters.yml:過濾器是在每個請求都被執行的一小段代碼。這個文件用來定義哪些過濾器需要被執行,每個模塊都可以改寫過濾器配置。

settings.yml:這個文件存放symfony 應用程序的主要配置信息。你的應用程序是否使用國際化功能,它的默認語言,請求timeout 時間,是否開啓緩存功能等都在這個文件裏面定義。只要改變這個文件裏的一行代碼,你就可以關閉網站來執行維護升級器是在每個請求都被執行的一小段代碼。這個文件用來定義哪些過濾器需要被執行,每個模塊都可以改寫過濾器配置。

routing.yml:路由規則,能把難以理解的不好記憶的URL 變成"漂亮"的直觀形式。此配置文件用來存放這些信息。每個新應用程序都會有一些默認路由規則。

view.yml:這個文件裏定義默認視圖的結構(佈局的名稱,標題,還有metatag;默認載入的樣式表及Javascript;默認的content-type 等)。還有默認的meta 與標題標籤。


3、模塊配置(module)

默認情況下,模塊沒有特別的配置信息。不過,如果你需要,你可以爲某個模塊覆蓋應用程序級的配置。例如,你需要修改一個模塊裏所有動作的HTML 描述信息,或是載入一個特定的Javascript 文件。你可以選擇針對某個特定的模塊增加新參數來實現保護性封裝。

比如建立如下圖所示的目錄和文件:


generator.yml:根據數據庫表自動生成的模塊(腳手架與管理後臺)會用這個文件, 它用來定義界面怎麼顯示行和列,用戶可以執行哪些操作(過濾器,排序,按鈕等)。

module.yml:這個文件包含模塊的特殊參數(相當於app.yml,但這是模塊級的),還有動作的配置信息。

security.yml:這個文件用來給動作設置訪問限制。你可以在這裏設置哪個頁面只能給註冊用戶看或是一部分有特殊權限的註冊用戶看。

view.yml:這個文件包含模塊的一個或者所有動作的視圖配置信息。它會覆蓋應用程序級的view.yml。

數據驗證文件:雖然這些用來驗證表單輸入數據的YAML 數據驗證文件存放在validate/目錄而不是config/目錄裏,它們仍然屬於模塊配置文件。


二、環境

如果你有過一些開發經驗的話,你就會清楚再不同的開發環境下,配置是不同的,比如線上和線下的數據庫配置信息肯定是不同的,那麼如何在symfony中配置不同的開發環境呢?其實很簡單,下面是一個示例:

symfony 配置文件的結構
# 生產環境設置
prod:
...
# 開發環境設置
dev:
...
# 測試環境設置
test:
...
# 自定義環境設置
myenv:
...
# 所有環境的設置
all:
...

任何一個特定環境裏定義的參數優先於所有環境裏定義的參數,所有環境裏的參數優先於默認配置。模塊配置裏的參數優先於應用程序級裏定義的同樣參數,應用程序裏的參數優先於項目級。這可以通過下面的優先級列表來表示:
1. 模塊
2. 應用程序
3. 項目
4. 特定的環境

5. 所有環境

6. 默認


三、獲取配置信息

在symfony框架中可以使用syConfig類來獲取在配置文件中存放的信息,下面是一個示例:

在app.yml文件中定義appid和appsecret:

all:
  appid: wechatAppid
  appsercet: wechatAppserecet


注:symfony有配置緩存,如修改了配置文件,需要清理配置文件緩存,可以使用如下命令清除symfony框架的配置緩存:

執行完此命令後仔細觀察cache目錄的變化,會發現cache目錄下的文件都被清空了(目錄結構還繼續保留)


在控制器中獲取:

$host = sfConfig::get('app_appid');
參數的名字由幾部分組成,中間用下劃線分割,順序如下:
① 與配置文件名有關的前綴 (sf_ 代表 settings.yml, app_ 代表app.yml, mod_ 代表 module.yml, sf_i18n_ 代表 i18n.yml,sf_logging_ 代表 logging.yml)
② 父鍵名 (如果有), 小寫形式
③ 鍵名, 小寫形式


symfony 支持在YAML 文件裏使用常量。如果遇到%包起來的大寫形式的設置名(可以通過sfConfig::get()取得值),配置文件處理器會用這個設置的當前值來替換這個常量。

autoload.yml中的示例:

autoload:
symfony:
name: symfony
path: %SF_SYMFONY_LIB_DIR%
recursive: on
exclude: [vendor]
path 參數的值會是執行sfConfig::get('sf_symfony_lib_dir')的結果。如果一個配置文件依賴於另一個配置文件,被依賴的配置文件必須先被解析(請查symfony 的源代碼來了解配置文件載入的順序)。app.yml 是最後被解析的文件之一,所以你可以在這個文件裏使用其它文件裏定義的設置。


除此之外,symfony的YAML 文件可以包含PHP代碼,下面是一個示例:

all:
translation:
format: <?php echo sfConfig::get('sf_i18n') == true ? 'xliff' :
'none' ?>

發佈了88 篇原創文章 · 獲贊 31 · 訪問量 55萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章