Skip to content

控制器

阅读此文档,需要对 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\Backend Trait 类,前台发送的 查询、添加、编辑、删除、排序 操作都是通过此类实现的。
  • 当我们要新建一个控制器时,建议首先让它继承于 app\common\controller\Backend 类,之后,如果我们需要重写 查询、添加、编辑 等来自 Trait 类的方法,请复制 Trait 类的方法到控制器后进行重写即可。

前台基类

前台基类 app\common\controller\Frontendapi 应用下的所有控制器,都建议继承它,它已实现以下功能:

  • 自动根据用户 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 表字段的修改。