Appearance
控制器 ?
閱讀此文檔,需要對
ThinkPHP有基本的了解,TP控制器文檔
- 我們在
app\common\controller準備了Backend(后臺基類)和Frontend(前臺基類),系統幾乎所有的控制器都是繼承于它們的。 - 而以上的前后臺基類都是繼承于
Api類,在Api類中我們根據路由加載了語言包、檢查數據庫連接、IP黑名單等,同時定義了一些快捷響應方法。
快捷響應方法 ?
- 快捷響應方法定義于
Api基類,只用于控制器內快速創建響應,模型、公共方法中是不能使用它們的。 - 快捷響應方法內部拋出了一個
HttpResponseException,此舉優勢在于調用它們時無需return語句,劣勢在于不能在try代碼塊內使用。 - 快捷方法不影響您使用
return json();返回數據。
操作成功 ?
php
success($msg = '', $data = null, $code = 1, $type = null, $header = [], $options = []);$msg操作成功的提示消息$data返回數據$code狀態碼$type輸出類型:json、jsonp、xml、response=輸出HTML、view=渲染模板輸出、redirect=頁面重定向、download=附件下載$header發送的Header頭$options發送的額外參數
操作失敗 ?
此方法與 success() 方法只有 code 是不一樣的。
php
error($msg = '', $data = null, $code = 0, $type = null, array $header = [], $options = []);返回數據 ?
success() 和 error() 方法都是基于它封裝。
php
result($msg, $data = null, $code = 0, $type = null, $header = [], $options = []);使用示例 ?
php
$this->success('操作成功~');
$this->success('操作成功~', [
'title' => '標題',
'content' => '內容',
]);
$this->error('操作失敗~');后臺基類 ?
后臺基類 app\common\controller\Backend,后臺的所有控制器,都是繼承于它的,它已實現以下功能:
- 自動根據
token完成管理員的登錄和鑒權。 - 構建和組裝查詢
SQL,比如前臺發送的快速搜索、公共搜索、排序等操作,都是由此類下的queryBuilder()方法構建的查詢SQL。 - 引入了
Trait類來實現查詢、添加、編輯等功能。
TIP
做后臺二次開發前,請一定翻閱 app\common\controller\Backend 文件,以此您可以知道后臺控制器可以利用基類做到那些事情,因為父類可以直接重寫這些屬性,比如:配置免登陸方法、免鑒權方法、入庫排除字段、快捷搜索字段、默認排序、數據權限控制、模型驗證等。
后臺 Trait 類 ?
- 我們準備了
app\admin\library\traits\BackendTrait 類,前臺發送的查詢、添加、編輯、刪除、排序操作都是通過此類實現的。 - 當我們要新建一個控制器時,建議首先讓它繼承于
app\common\controller\Backend類,之后,如果我們需要重寫查詢、添加、編輯等來自Trait類的方法,請復制Trait類的方法到控制器后進行重寫即可。
前臺基類 ?
前臺基類 app\common\controller\Frontend,api 應用下的所有控制器,都建議繼承它,它已實現以下功能:
- 自動根據用戶
token完成會員的登錄和鑒權。
前臺基類屬性 ?
新建控制器并繼承于 前臺基類,可以直接重寫這些屬性。
php
/**
* 無需登錄的方法
* 訪問本控制器的此方法,無需會員登錄
*/
protected array $noNeedLogin = [];
/**
* 無需鑒權的方法
*/
protected array $noNeedPermission = [];
/**
* 權限類實例
* @var Auth
*/
protected Auth $auth;前后臺權限類實例 ?
在繼承于 前臺或后臺 的基類之后,當前類會繼承到一個權限類實例,我們可以通過它獲取到管理員或會員的個人資料等信息,登錄的是管理員還是會員,取決與繼承于 前臺 還是 后臺。
php
// 管理員或會員是否登錄
$this->auth->isLogin();
// 獲取會員數據模型
$this->auth->getUser();
// 獲取管理員數據模型
$this->auth->getAdmin();
// 獲取管理員或會員登錄token
$this->auth->getToken();
// 獲取管理員或會員刷新token
$this->auth->getRefreshToken();
// 獲取管理員信息-只輸出允許輸出的字段
$this->auth->getInfo();
// 獲取會員信息-只輸出允許輸出的字段
$this->auth->getUserInfo();
// 是否是超管,擁有后臺所有權限節點
$this->auth->isSuperAdmin();
// 是否是擁有所有會員中心權限的會員
$this->auth->isSuperUser();修改會員余額和積分 ?
若有編程修改會員余額的需要,請勿直接操作會員余額字段,請通過 app\admin\model\UserMoneyLog 余額日志模型,開啟事務后,直接添加一條余額日志,會員余額會自動增減。
php
Db::startTrans();
try {
UserMoneyLog::create([
'user_id' => 1,
'money' => 1,
'memo' => '測試添加 1 元'
]);
Db::commit();
} catch (Throwable $e) {
Db::rollback();
$this->error($e->getMessage());
}同樣的,若有編程修改會員積分的需要,請通過 app\admin\model\UserScoreLog 積分日志模型,開啟事務后,直接添加一條積分日志,會員積分會自動增減。
php
Db::startTrans();
try {
UserScoreLog::create([
'user_id' => 1,
'score' => 1,
'memo' => '測試添加 1 積分'
]);
Db::commit();
} catch (Throwable $e) {
Db::rollback();
$this->error($e->getMessage());
}以上的修改余額或積分中,開啟事務是很關鍵的,因為在日志創建過程,我們封裝了涉及到 user 表字段的修改。

