ThinkPHP 3.2 引入命名空間,舊版 Lib/Action/BaseAction 架構不再適用。本文提供基於 Common/Controller/BaseController 的前後台共用基類實作,解決跨模組繼承與 A() 呼叫煩瑣問題。
Application/
├── Common/
│ └── Controller/
│ └── BaseController.class.php # 共用基類
├── Home/
│ └── Controller/
│ ├── BaseController.class.php # 前台專用基類(可選)
│ └── NewsController.class.php
└── Admin/
└── Controller/
├── BaseController.class.php # 後台專用基類(可選)
└── UserController.class.php
<?php
namespace Common\Controller;
use Think\Controller;
/**
* 前後台公用基類
* @author Jack
* @date 2014-07-12
*/
class BaseController extends Controller {
public function _initialize() {
// 全域初始化:語系、時區、權限檢查等
dump('基類初始化'); // 除錯用
$this->cfg();
}
protected function cfg() {
// 共用配置邏輯
$this->assign('site_name', C('SITE_NAME'));
}
}
<?php
namespace Home\Controller;
use Common\Controller\BaseController;
class NewsController extends BaseController {
public function index() {
$list = $this->getNewsList();
$this->assign('list', $list);
$this->display();
}
protected function getNewsList() {
return M('News')->order('id DESC')->select();
}
}
<?php
// Home/Controller/BaseController.class.php
namespace Home\Controller;
use Common\Controller\BaseController as CommonBaseController;
class BaseController extends CommonBaseController {
public function _initialize() {
parent::_initialize();
// 前台專用:SEO、選單、使用者狀態
$this->assign('nav_active', 'home');
}
}
// NewsController 改繼承 Home\Controller\BaseController
namespace Home\Controller;
use Home\Controller\BaseController;
class NewsController extends BaseController { ... }
| 重點 | 說明 |
|---|---|
| 命名空間宣告 | 每個類別必須宣告 namespace,對應目錄結構 |
| use 引入 | 跨命名空間繼承需 use Common\Controller\BaseController |
| 基類鏈 | Common → Home/Admin → 具體 Controller,避免重複造輪子 |
| 資源共用 | 公共模型、函數、配置放在 Common,各模組直接使用 |
$this->method() 呼叫A('Common/Controller') 字串硬編碼,重構更安全public function _initialize() 且子類別未覆寫未呼叫 parent::_initialize()Home/View/News/index.html