繼承 yii\base\Controller(Web 應用用 yii\web\Controller,Console 用 yii\console\Controller),負責:接收請求 → 解析路由 → 實例化操作 → 執行前置過濾 → 綁定參數執行操作 → 執行後置過濾 → 返回響應。
請求 ?r=module/controller/action 或 PATH_INFO /module/controller/action:
post-comment → PostCommentControllerhello-world → actionHelloWorld()命名空間映射:yii\base\Application::controllerNamespace (預設 app\controllers) + 子目錄對應模組/子命名空間。
| 類型 | 定義方式 | 優點 | 缺點 |
|---|---|---|---|
| 內聯 | Controller 內 public function actionXyz() | 簡單、就近維護、IDE 支援好 | 難以跨控制器復用 |
| 獨立 | 繼承 yii\base\Action,在 actions() 註冊 | 可復用、可獨立擴展、支援任意 ID 字符 | 結構分散、需額外文件 |
message;
}
}
// Controller 註冊
public function actions() {
return [
'hello' => [
'class' => 'app\components\HelloWorldAction',
'message' => 'Welcome!',
],
'error' => 'yii\web\ErrorAction', // 內建錯誤頁
'view' => [
'class' => 'yii\web\ViewAction',
'viewPrefix' => '',
],
];
}
public function actionView($id, $slug = null, array $tags = []) {
// GET /post/view?id=123&slug=hello&tags[]=php&tags[]=yii
// $id=123, $slug='hello', $tags=['php','yii']
// 缺少必填參數 → 自動拋出 BadRequestHttpException (400)
// 類型聲明 array 自動將標量轉為單元素陣列
}
支援:標量、陣列(array 型別聲明)、預設值、必填檢查。Console 應用對應命令行參數綁定。
__construct() → init()Application::beforeAction() → Module::beforeAction() → Controller::beforeAction()false → 取消執行,跳過後續 beforeAction 並直接進入 afterActionrun() / actionXyz()(含參數綁定)Controller::afterAction() → Module::afterAction() → Application::afterAction()beforeAction/afterAction 事件(可掛載監聽器)Response::data,最終序列化輸出Response 物件 → 直接作為響應(如 redirect() 返回 RedirectResponse)Response::exitStatusModel::load() + validate(),而非 Controller 手寫驗證return $this->render('view', ['model' => $model]),避免在 Controller 拼 HTMLNotFoundHttpException、ForbiddenHttpException 等內建異常,由 ErrorHandler 統一渲染behaviors() 掛載public $defaultAction = 'index'; 讓 ?r=controller 直接進入列表頁| 現象 | 原因 | 修正 |
|---|---|---|
| 404 找不到操作 | 操作方法非 public 或非 action 開頭 | 改為 public function actionXxx() |
| 參數綁定失敗 | GET 參數名與方法參數名不一致 | 檢查大小寫、下劃線、前端參數名 |
| beforeAction 返回 false 但仍執行 | 父類 beforeAction 未返回 false 繼續鏈路 | 確保鏈路中任一 false 即可阻斷 |
Yii Controller 以「約定優於配置」實現路由映射、參數綁定、生命周期管理,配合獨立操作與行為機制,支撐從簡單 CRUD 到複雜多模組應用的全谱系開發需求。