Yii 框架中,控制器動作預設以方法形式定義(如 actionCreate())。隨著專案增長,將邏輯封裝為獨立的動作類,可大幅提升程式碼復用性與可維護性。本文示範如何定義、註冊與使用動作類。
繼承 CAction,實作 run() 方法:
class UpdateAction extends CAction {
public function run() {
// 動作邏輯:載入模型、處理表單、渲染視圖等
// $this->controller 可存取控制器實例
}
}
覆寫控制器的 actions() 方法,回傳動作 ID 與類路徑的對應陣列:
class PostController extends CController {
public function actions() {
return array(
// 使用路徑別名指向 protected/controllers/post/UpdateAction.php
'edit' => 'application.controllers.post.UpdateAction',
// 也可傳遞建構參數
'publish' => array(
'class' => 'application.components.actions.PublishAction',
'status' => Post::STATUS_PUBLISHED,
),
);
}
}
application.controllers.post.UpdateAction → protected/controllers/post/UpdateAction.phpapplication.components.actions.PublishAction → protected/components/actions/PublishAction.phpadmin.controllers.article.UpdateActionpublic function run() {
$controller = $this->getController();
$model = $controller->loadModel($_GET['id']);
// ...
}
$controller->redirect(array('view', 'id' => $model->id));
// 或
$controller->render('update', array('model' => $model));
動作類的 run() 方法可直接宣告參數,Yii 會自動從 $_GET 綁定:
public function run($id, $version = null) {
// $id 自動對應 $_GET['id']
}
將動作類按功能域歸類放置:
protected/
components/
actions/ # 通用動作:PublishAction, DeleteAction, ExportAction
controllers/
post/
UpdateAction.php # PostController 專用動作
CreateAction.php
user/
ProfileAction.php
modules/
admin/
controllers/
article/
ApproveAction.php
| 優點 | 缺點 |
|---|---|
| 邏輯可跨控制器、模組復用 | 增加類檔案數量,專案結構稍複雜 |
| 單一職責,易於單元測試 | 簡單動作用類反而過度設計 |
| 支援參數注入,配置靈活 | 除錯時堆疊層級較深 |
建議:通用 CRUD 操作、複雜多步驟流程、需在多處復用的邏輯採用動作類;簡單的單一頁面動作,直接寫在控制器方法即可。