yii 2.0 代码阅读 小记
1.\yii\base\object
設置了get/set屬性...使用getName()獲取屬性名..構造函數中使用config初始化屬性
2.\yii\base\Component 繼承自Object
額外擁有behaviors和events屬性
get,會比object多查找自己的behaviors中的屬性
set,on開通的會綁定事件,as開頭的會添加行為,最后會查找所有的behaviors,并設置屬性
__call 會調用所有behaviors中是否有該方法
event on 添加事件,off移除事件,trigger觸發事件
?
Yii中這個Behaviour是Event Handler的另一種表現形式而已,對事件的處理函數進行了封裝
attachBehavior detachBehavior
?
Component::__construct 或者Object::__construct 的時候.就是綁定了屬性
------------------------------------------
3.\yii\base\Event中提供了很多靜態方法供外部使用.如on off trigger
同時.擁有 name,sender觸發者,handled觸發結果是個boolean值,用于停止觸發.data,觸發數據
trigger 可以觸發父級的事件..具體看代碼
<pre>
if (is_object($class)) {
$class = get_class($class);
} else {
$class = ltrim($class, '\\');
}
do {
if (!empty(self::$_events[$name][$class])) {
foreach (self::$_events[$name][$class] as $handler) {
$event->data = $handler[1];
call_user_func($handler[0], $event);
if ($event instanceof Event && $event->handled) {
return;
}
}
}
} while (($class = get_parent_class($class)) !== false);
</pre>
4.\yii\base\Behavior
封裝了事件處理方法,當添加一個行為的時候,就是綁定了該behavior中的多個事件
5.yii\base\Module
從模塊中使用__get..可以直接獲取模塊中的組件
getComponent...會在第一次的時候實例化組件
setComponent 只是將組件的類名保存起來
preloadComponents 會通過配置中的preload屬性的id使用getComponent實例化..同時使用getModule進行模塊實例化并保存
?
getModule 如果是加載子模塊,會先加載父模塊..再加載子模塊.
setModule 將模塊名字保存到_modules中
_basePath 模塊路徑,沒有在配置中設置的話,就會反射類名使用dirname取得目錄名
_controllerPath 沒有設置的話會_basePath/controllers
_viewPath 沒有設置的話會是_basePath/views
_layoutPath 沒有設置的話會是 _viewPath/layouts
defaultRoute="default" 默認路由
?
runAction($route,$params)--------------- Yii::$app->controller
1.createController(route) 返回控制器和action
2.$controller->runAction($actionID, $params);返回結果
3.在動作執行完后,會重設Yii::$app->controller為原來的控制器
createController($route)
1.route為空的話.使用defaultRoute 即是default
2.對route進行分割..獲取id(模塊id||控制器id)和action
3.如果確實有getModule(id).則使用module創建控制器
4.controllerMap有該id則創建控制器
5.根據controllerPath,查找是否有該控制器.有的話則實例化.并將id和模塊傳入構造函數.
6.返回控制器和action.
?
6.yii\base\Controller
runAction ---- Yii::$app->requestedAction---- $this->action
1.使用createAction創建動作.
2.會觸發actionEvent中的Application::EVENT_BEFORE_ACTION事件,這里可操作事件的isValid屬性.
3.會執行該控制器所屬模塊的beforeAction方法$this->module->beforeAction..觸發自身的self::EVENT_BEFORE_ACTION事件
4.會執行該控制器的$this->beforeAction方法..
5.如果上面三個都是返回true的話,則 $action->runWithParams($params);
6.執行控制器的afterAction函數,觸發自身的self::EVENT_AFTER_ACTION事件
7.執行模塊的afterAction函數
8.觸發Application::EVENT_AFTER_ACTION事件
9.在動作執行完后,會重設$controller->action為原來的動作
createAction
1.action為空的話.為defaultAction為 index
2.如果$actionMap中含有的話則..實例化動作
3.action+動作id..如果控制器中有該方法,則創建InlineAction($id,$this,$methodName)
7.yii\base\Application
比模塊多了錯誤處理.和注冊了CoreComponents
log errorHandler formatter i18n urlManager view
?
?
initExtensions
會將擴展文件中的別名設置
?
run();
觸發 EVENT_BEFORE_REQUEST
執行handleRequest(請求組件)獲取響應..
觸發 EVENT_AFTER_REQUEST
$response->send();
8. yii\web\Application
注冊了核心組件 request response session user assetManager
defaultRoute 為site
$_homeUrl 主頁地址.可設置.不設置為scripturl
?
handleRequest
1.設置@webroot和@web為scriptfile和baseurl
2.使用請求組件解析url返回路由..或者使用catchAll返回路由..catchAll可以作為一個動作進行特殊處理例如,網站關閉則xxx.不關閉則使用$request->resolve()
3.執行 runAction.如果返回的數據繼承與Response.則直接返回.
4.如果返回的數據不是response則把數據設置為response的data.再返回
?
?
?
總結
以上是生活随笔為你收集整理的yii 2.0 代码阅读 小记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2022年银行卡开户新规,有以下两种情况
- 下一篇: 菜鸟学SSH(八)——Hibernate