主流框架將同一模組所有 Action 集中在單一 Controller 類別:
<?php
class UserController extends Controller {
public function loginAction() { /* ... */ }
public function registerAction() { /* ... */ }
public function profileAction() { /* ... */ }
// 可能十幾個 action
}
請求 /user/login 時,仍需載入整個類別檔案,包含 registerAction、profileAction 等無關代碼。PHP 載入、解析、編譯無用代碼浪費記憶體與 CPU。
OOP 本身無錯,關鍵在於「用面向過程思維寫 OOP」。Controller 應只負責路由分派,真正業務邏輯應在 Action 類別。
參考 Struts 設計,每個 Action 獨立檔案:
<?php
// LoginAction.php
class LoginAction extends Action {
public function run() { /* 登入邏輯 */ }
}
// RegisterAction.php
class RegisterAction extends Action {
public function run() { /* 註冊邏輯 */ }
}
路由直接對應 Action 類別,請求時僅載入該 Action,徹底消除冗餘。
user/login → LoginAction)。| 指標 | 傳統 Controller | Action 類別化 |
|---|---|---|
| 載入檔案大小 | 大(含所有 action) | 小(單一 action) |
| 記憶體佔用 | 高 | 低 |
| Opcode 快取效率 | 低(大量無用 opcode) | 高 |
| 單元測試 | 困難(耦合度高) | 容易(單一職責) |
__invoke() 單一 Action 類別(Invokable Controller)yii\base\Action 獨立類別,可掛載至 Controller核心思想一致:將「做什麼」與「怎麼路由」分離,讓 Action 專注業務邏輯。