from http://www.yiichina.com/guide/basics.application
應用是指請求處理中的執行上下文。它的主要任務是分析用戶請求並將其分派到合適的控制器中以作進一步處理。 它同時作爲服務中心,維護應用級別的配置。鑑於此,應用也叫做前端控制器
。
應用由 入口腳本 創建爲一個單例對象。這個應用單例對象可以在任何地方通過 Yii::app() 訪問。
應用配置
默認情況下,應用是一個 CWebApplication 的實例。要自定義它,我們通常需要提供一個配置文件 (或數組) 以創建應用實例時初始化其屬性值。自定義應用的另一種方式是繼承 CWebApplication。
配置是一個鍵值對數組。每個鍵代表應用實例中某屬性的名字,每個值即相應屬性的初始值。 例如,如下的配置設定了應用的name 和 defaultController 屬性。
array( 'name'=>'Yii Framework', 'defaultController'=>'site', )
我們通常在一個單獨的PHP 腳本(e.g.protected/config/main.php
)中保存這些配置。在腳本中,
我們通過以下方式返回此配置數組:
return array(...);
要應用此配置,我們將配置文件的名字作爲參數傳遞給應用的構造器,或像下面這樣傳遞到 Yii::createWebApplication() 。這通常在 入口腳本 中完成:
$app=Yii::createWebApplication($configFile);
提示: 如果應用配置非常複雜,我們可以把它分割爲若干文件,每個文件返回配置數組中的一部分。 然後,在主配置文件中,我們調用PHP的
include()
包含其餘的配置文件並把它們合併爲一個完整的配置數組。
應用基礎目錄
應用基礎目錄指包含了所有安全敏感的PHP腳本和數據的根目錄。默認狀態下,它是一個位於含有入口腳本目錄的名爲protected
的子目錄。它可以通過設置 application
configuration 中的 basePath 屬性自定義。
在應用基礎目錄下的內容應該保護起來防止網站訪客直接訪問。對於 Apache
HTTP 服務器, 這可以通過在基礎目錄中放置一個.htaccess
文件很簡單的實現。 .htaccess
內容如下:
deny from all
應用組件
應用的功能可以通過其靈活的組件結構輕易地自定義或增強。應用管理了一系列應用組件,每個組件實現一特定功能。 例如,應用通過 CUrlManager 和 CHttpRequest 的幫助解析來自用戶的請求。
通過配置應用的 components 屬性, 我們可以自定義應用中用到的任何組件類及其屬性值。例如,我們可以配置應用的CMemCache 組件, 這樣它就可以使用多個 memcache 服務器實現緩存:
array( ...... 'components'=>array( ...... 'cache'=>array( 'class'=>'CMemCache', 'servers'=>array( array('host'=>'server1', 'port'=>11211, 'weight'=>60), array('host'=>'server2', 'port'=>11211, 'weight'=>40), ), ), ), )
如上所示,我們在 components
數組中添加了 cache
元素。cache
元素表明此組件的類是 CMemCache
,
他的 servers
屬性應依此初始化。
要訪問一個應用組件,使用 Yii::app()->ComponentID
,其中的 ComponentID
是指組件的ID(例如 Yii::app()->cache
)。
應用的組件可以通過在其配置中設置 enabled
爲
false 禁用。當我們訪問被禁用的組件時將返回 Null。
提示: 默認情況下,應用組件會按需創建。這意味着一個應用的組件如果沒有在一個用戶請求中被訪問,它可能根本不被創建。 因此,如果一個應用配置了很多組件,其總體性能可能並不會下降。有的應用組件 (例如CLogRouter) 可能需要在無論它們是否被訪問的情況下都要被創建。 要實現這個,需將其ID列在應用的 preload屬性裏。
核心應用組件
Yii 預定義了一系列核心應用組件,提供常見 Web 應用中所用的功能。例如, request 組件用於解析用戶請求並提供例如 URL,cookie 等信息。 通過配置這些核心組件的屬性,我們可以在幾乎所有的方面修改Yii 的默認行爲。
下面我們列出了由 CWebApplication 預定義的核心組件。
-
assetManager: CAssetManager - 管理私有資源文件的發佈。
-
authManager: CAuthManager - 管理基於角色的訪問控制 (RBAC).
-
cache: CCache - 提供數據緩存功能。注意,你必須指定實際的類(例如CMemCache, CDbCache)。 否則,當你訪問此組件時將返回 NULL。
-
clientScript: CClientScript - 管理客戶端腳本 (javascripts 和 CSS).
-
coreMessages: CPhpMessageSource - 提供 Yii 框架用到的核心信息的翻譯。
-
db: CDbConnection - 提供數據庫連接。注意,使用此組件你必須配置其 connectionString 屬性。
-
errorHandler: CErrorHandler - 處理未捕獲的 PHP 錯誤和異常。
-
format: CFormatter - 格式化數值顯示。此功能從版本 1.1.0 起開始提供。
-
messages: CPhpMessageSource - 提供Yii應用中使用的信息翻譯。
-
request: CHttpRequest - 提供關於用戶請求的信息。
-
securityManager: CSecurityManager - 提供安全相關的服務,例如散列,加密。
-
session: CHttpSession - 提供session相關的功能。
-
statePersister: CStatePersister - 提供全局狀態持久方法。
-
urlManager: CUrlManager - 提供 URL 解析和創建相關功能
-
themeManager: CThemeManager - 管理主題。
應用的生命週期
當處理用戶請求時,應用將經歷如下聲明週期:
-
通過 CApplication::preinit() 預初始化應用;
-
設置類的自動裝載器和錯誤處理;
-
註冊核心類組件;
-
加載應用配置;
-
通過 CApplication::init() 初始化應用:
- 註冊應用行爲;
- 載入靜態應用組件;
-
觸發 onBeginRequest 事件;
-
處理用戶請求:
- 解析用戶請求;
- 創建控制器;
- 運行控制器;
-
觸發 onEndRequest 事件。