控制器是 MVC 架構中處理用戶請求、協調模型與視圖的核心組件。Zend Framework 通過 Zend_Controller_Action 定義了控制器基類,並約定了目錄結構、命名規範與生命週期鉤子。本文將系統梳理控制器開發規範、常見用法與進階技巧。
application/
├── Bootstrap.php
├── configs/
│ └── application.ini
├── controllers/
│ ├── ErrorController.php
│ └── IndexController.php
├── models/
└── views/
├── helpers/
└── scripts/
├── error/
│ └── error.phtml
└── index/
└── index.phtml
| 規則 | 說明 | 示例 |
|---|---|---|
| 文件存放 | 默認 application/controllers/ | 可通過 setControllerDirectory() 自定義 |
| 文件名 | 類名 + .php | IndexController.php |
| 類名 | 駝峰 + Controller 後綴 | NewsListController |
| 繼承基類 | 必須繼承 Zend_Controller_Action | class IndexController extends Zend_Controller_Action |
| 初始化方法 | init() 用於通用初始化 | 權限檢查、視圖設置等 |
$front = Zend_Controller_Front::getInstance();
// 單一默認目錄
$front->setControllerDirectory('../application/controllers');
// 多模塊目錄映射
$front->setControllerDirectory([
'default' => '../application/controllers',
'blog' => '../modules/blog/controllers',
'news' => '../modules/news/controllers',
]);
// 動態添加模塊目錄
$front->addControllerDirectory('../modules/foo/controllers', 'foo');
Action 結尾:indexAction()、listAction()$this->_getParam('key') 或 $this->getRequest()->getParam('key') 獲取參數views/scripts/{controller}/{action}.phtml$this->_helper->viewRenderer->setNoRender(true)class IndexController extends Zend_Controller_Action {
public function init() {
// 通用初始化:ACL、視圖設置、佈局選擇等
}
public function indexAction() {
// 業務邏輯
$this->view->data = $this->getService()->fetchAll();
}
}
class ErrorController extends Zend_Controller_Action {
public function errorAction() {
$errors = $this->_getParam('error_handler');
if (!$errors) return;
switch ($errors->type) {
case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_CONTROLLER:
case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ACTION:
$this->getResponse()->setHttpResponseCode(404);
break;
default:
$this->getResponse()->setHttpResponseCode(500);
}
$this->view->errors = $errors;
}
}
class ApiController extends Zend_Controller_Action {
public function init() {
$this->_helper->viewRenderer->setNoRender(true);
$this->_helper->layout->disableLayout();
$this->getResponse()->setHeader('Content-Type', 'application/json');
}
public function getAction() { /* 查詢 */ }
public function postAction() { /* 創建 */ }
public function putAction() { /* 更新 */ }
public function deleteAction() { /* 刪除 */ }
}
// 重定向
$this->_helper->redirector('index', 'index', 'default');
// 閃存消息
$this->_helper->flashMessenger->addMessage('操作成功');
// JSON 響應
$this->_helper->json($data);
// 自定義視圖腳本
$this->render('custom'); // 渲染 custom.phtml
public function preDispatch() {
// 權限檢查、數據預加載
if (!$this->getAuth()->hasIdentity()) {
$this->_helper->redirector('login', 'auth');
}
}
public function postDispatch() {
// 響應後處理、日誌記錄
}
遵循 Zend Framework 控制器規範,善用 init()/preDispatch()/postDispatch() 生命週期,結合動作輔助器與視圖渲染機制,能構建清晰、可維護的控制器層。多模塊目錄映射與錯誤處理規範是企業級應用的必備基礎設施。