Yii framework - Entry Script & Basic Application

在Yii建出專案資料夾的最上層有個index.php當作應用程式的進入點。

index.php

這裡面大概做了幾件事:

  • 定義一些常數(設定值) define vs const
  • require\framework\yii.php
  • Yii::createWebApplication($config)->run();,傳入設定檔並建立一個WebApplication,然後啟動

framework\yii.php

這個檔案只做兩件事,

  • 判斷Class YiiBase 是否存在,不存在就載入YiiBase.php
1
2
if(!class_exists('YiiBase', false))
require(dirname(__FILE__).'/YiiBase.php');
  • 定義Class Yii extends YiiBase

framework\YiiBase.php

  • 定義了Yii的一些常數預設值
  • 定義Class YiiBase
  • auto load Yii core classes
  • require base\interfaces.php

不建議更動及呼叫這個核心檔的東西,使用寫在yii.php的Class Yii比較好。

createWebApplication()就是在這時候被載入的。

  • Yii::createWebApplication()

    接收設定檔,並回傳呼叫createApplication('CWebApplication', $config)的結果

  • Yii::createApplication()

    接收要啟用的應用及設定檔,並且回傳依據名稱建立出來對應的應用物件,這裡會建立出一個CWebApplication物件。

framework\web\CWebApplication.php

  • 定義Class CWebApplication extends CApplication

framework\base\CApplication.php

  • 定義Class CApplication extends CModule

CWebApplication物件使用了這裡的__construct()建立,並且從這裡繼承了run()方法。

Application life cycle

CWebApplication建立(construct)時大概會發生一些事

  • 呼叫preinit()(從CModule繼承而來),預先初始化一些模組
  • 呼叫initSystemHandlers(),初始化啟用yii的例外錯誤處理
  • 呼叫registerCoreComponents(),註冊核心組件
    • coreMessages => CPhpMessageSource : 提供Yii的核心訊息翻譯,預設是en_us
    • db => CDbConnection : 提供Database連線,使用時需要設定DSN(Data Source Name)
    • messages => CPhpMessageSource : 提供Yii的應用程式訊息翻譯
    • errorHandler => CErrorHandler : 處理程式中未處理的PHP例外錯誤處理,依據錯誤類型調用適當的view顯示
    • securityManager => CSecurityManager : 提供資安相關功能,ex. hash, crypto…等
    • CStatePersister => statePersister : 提供全域的狀態維持功能
    • urlManager => CUrlManager : 提供URL相關功能
    • request => CHttpRequest : 提供http request相關功能
    • format => CFormatter : 提供數據顯示格式化功能
  • 呼叫configure($config)(從CModule繼承而來),載入剛剛傳進來的config
  • 呼叫attachBehaviors($this->behaviors)(從CComponent繼承而來)
  • 呼叫preloadComponents(從CModule繼承而來)
  • 呼叫init()(從CModule繼承而來並在CWebApplication中有被覆寫)

建立後立即呼叫run()

  • 等待觸發onBeginRequest事件
  • 呼叫processRequest(),處理request、create controller、run controller
  • 等待處發onEndRequest事件

CApplication中定義了abstract public function processRequest();,內容由各子類別自己去實作。

另外參考:
http://www.cnblogs.com/JosephLiu/archive/2011/12/19/2292852.html

CApplication::__construct()

這裡的$this是指CWebApplication物件

  • 134行: 設定應用程式物件,這樣在應用環境中使用Yii::app()就可以取得該CWebApplication實例
  • 137行: require config
  • 139~145行: 設定basePath
  • 146~159行: 設定了路徑的別名以利使用
  • 161行: yii預留的方法,預設是沒有內容的,需要的話可以自行覆寫
  • 163行: 初始化yii的Exception handler,預設應該是啟用的
  • 164行: 註冊必須的核心模組,registerCoreComponents()最後其實呼叫到了繼承自CModule的setComponent(),將component的實體存入_components中 (???not sure)
  • 166行: 將設定值轉成應用程式實體的屬性,configure()方法繼承自CModule,可以看到他其實是這樣設的$this->$key=$value;,在存取設定不存在的屬性時,會分別用到CModule中的__get()及CComponent中的__set()
  • 167行: attach application behaviors,大概是個註冊事件集合的概念
  • 168行: 將configure中從main.php中載入的preload component,存入_components中,完成初始化
  • 170行: 呼叫init(),這個方法在CWebApplication中有被覆寫。先跑父層的init(),並且呼叫getRequest(‘request’)。getRequest()使用到CModule中的getComponent(),取得對應的request component實體並回傳。

推薦文章