Skip to content

控制器

阅读此文档,需要对 ThinkPHP 有基本的了解,TP控制器文档

  • 我们在 app\common\controller 准备了 Backend(后台基类)和 Frontend(前台基类),系统几乎所有的控制器都是继承于它们的。
  • 而以上的前后台基类都是继承于 Api 类,在 Api 类中我们根据路由加载了语言包等,同时定义了以下快捷方法:

快捷方法

操作成功

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 发送的额外参数
使用示例
php
$this->success('操作成功~');
$this->success('操作成功~', [
    'title'   => '标题',
    'content' => '内容',
]);

操作失败

此方法与 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 = []);

后台基类

后台基类 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 = null;

前后台权限类实例

在继承于 前台或后台 的基类之后,当前类会继承到一个权限类实例,我们可以通过它获取到管理员或会员的个人资料等信息,登录的是管理员还是会员,取决与继承于 前台 还是 后台

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 表字段的修改。