首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

Yii 進階技巧:使用動作類實現可復用的控制器邏輯

     編輯:PHP 相關知識

Yii 進階技巧:使用動作類實現可復用的控制器邏輯

Yii 框架中,控制器動作預設以方法形式定義(如 actionCreate())。隨著專案增長,將邏輯封裝為獨立的動作類,可大幅提升程式碼復用性與可維護性。本文示範如何定義、註冊與使用動作類。

1. 定義動作類

繼承 CAction,實作 run() 方法:

class UpdateAction extends CAction {
    public function run() {
        // 動作邏輯:載入模型、處理表單、渲染視圖等
        // $this->controller 可存取控制器實例
    }
}

2. 在控制器中註冊動作類

覆寫控制器的 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,
            ),
        );
    }
}

3. 路徑別名解析規則

  • application.controllers.post.UpdateAction → protected/controllers/post/UpdateAction.php
  • application.components.actions.PublishAction → protected/components/actions/PublishAction.php
  • 支援模組路徑:admin.controllers.article.UpdateAction

4. 動作類中的最佳實踐

存取控制器屬性與方法

public function run() {
    $controller = $this->getController();
    $model = $controller->loadModel($_GET['id']);
    // ...
}

重導向與渲染

$controller->redirect(array('view', 'id' => $model->id));
// 或
$controller->render('update', array('model' => $model));

參數綁定(Yii 1.1.7+)

動作類的 run() 方法可直接宣告參數,Yii 會自動從 $_GET 綁定:

public function run($id, $version = null) {
    // $id 自動對應 $_GET['id']
}

5. 組織架構建議

將動作類按功能域歸類放置:

protected/
  components/
    actions/           # 通用動作:PublishAction, DeleteAction, ExportAction
  controllers/
    post/
      UpdateAction.php # PostController 專用動作
      CreateAction.php
    user/
      ProfileAction.php
  modules/
    admin/
      controllers/
        article/
          ApproveAction.php

優缺點總結

優點缺點
邏輯可跨控制器、模組復用增加類檔案數量,專案結構稍複雜
單一職責,易於單元測試簡單動作用類反而過度設計
支援參數注入,配置靈活除錯時堆疊層級較深

建議:通用 CRUD 操作、複雜多步驟流程、需在多處復用的邏輯採用動作類;簡單的單一頁面動作,直接寫在控制器方法即可。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved