Yii2 執行流程分析之 Controller

2021-10-11 15:34:41 字數 2709 閱讀 9340

1. 繼承與實現

controller 繼承於 component, 並實現了 viewcontextinte***ce 介面。

在 controller 重要的有兩塊: action, view。

2. actions()

public function actions()

在自定義的 xxcontroller 類中可以看見各種 action*** 函式:actionindex, actioncreate

而 actions() 用於新增額外的 action 函式,如果有需要,派生類可以過載它:

public function actions()

這樣,只要再新增view/xx/error.php 就可以使用這個action了。

3. createaction

public function createaction( $id )

// 優先查詢額外新增的 action

$actionmap = $this->actions();

if (isset($actionmap[$id]))

// $id 的命名規則:

// 由 a~z, 0~9, \, -, _ 組成, 且不能包含 --

// $id 頭尾都不能有-

elseif (preg_match('/^[a-z0-9\\-_]+$/', $id) && strpos($id, '--') === false && trim($id, '-') === $id) }}

return null;

}

4. getmodules()

該函式返回其主人,主人的主人…的組合

public function getmodules()

return $modules;

}

5. runaction()
public function runaction($id, $params = )

yii::trace('route to run: ' . $action->getuniqueid(), __method__);

$oldaction = $this->action;

$this->action = $action;

$modules = ;

$runaction = true;

// getmodules() 儲存的主人順序是 越古老越前面

foreach ($this->getmodules() as $module)

else

}$result = null;

// 所有主人都滿足條件

// 判斷自己的 beforeaction() 是否滿足條件

if ($runaction && $this->beforeaction($action))

}$this->action = $oldaction;

return $result;

}

6. run()
public function run($route, $params = )

// 如果'/'不在開頭, 則有主人來執行,比如 site/index, site/create

elseif ($pos > 0)

else

}

7. findlayoutfile
public function findlayoutfile($view)

// 如果當前的 controller 沒有設定布局檔案,則往上一直找

elseif ($this->layout === null)

if ($module !== null && is_string($module->layout))

}if (!isset($layout))

// 以@開頭的, 會在別名系統中查詢真正的布局檔案

if (strncmp($layout, '@', 1) === 0)

// 以/開頭的, 則在應用程式的布局檔案目錄下查詢(一般位於views/layouts)

// 新建專案的時候,這裡一般有乙個 main.php 檔案

elseif (strncmp($layout, '/', 1) === 0)

// 其餘情況都在本 controller 的布局檔案目錄下查詢(比如 sitecontroller)

// 會在 views/site/ 下查詢

else

// 該布局檔案有返回副檔名, 則返回這個檔案

if (pathinfo($file, pathinfo_extension) !== '')

// 新增 php 副檔名

$path = $file . '.' . $view->defaultextension;

if ($view->defaultextension !== 'php' && !is_file($path))

return $path;

}

8. render(), rendercontent()
public function render($view, $params = )

public function rendercontent($content)

else

}

9. 參考

YII2 執行概述 Overview

每一次 yii 應用開始處理 http 請求時,它都會進行乙個近似的流程。使用者提交指向 入口指令碼web index.php的請求。應用會通過 request 請求 應用元件解析被請求的 路由。應用建立乙個 controller 控制器 例項具體處理請求。控制器會建立乙個 action 動作 例項...

yii2初探 程式啟動流程

1.入口指令碼 web index.php 2.index.php檔案分析 定義是否開啟 debug 模式 展示除錯資訊 defined yii debug ordefine yii debug true 定義開發模式 prod dev test defined yii env ordefine y...

Yii2應用的執行過程

每乙個框架都有乙個入口指令碼,yii2也不例外。一般來說,對於web應用的入口指令碼是yiibasepath frontend web目錄下的index.php。先觀察這個檔案 defined yii debug or define yii debug true defined yii env or...