# 控制器

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

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

# 快捷方法

# 操作成功

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

# 操作失败

此方法与success()方法只有code是不一样的。

error($msg = '', $data = null, $code = 0, $type = null, array $header = [], $options = []);

# 返回数据

success()error()方法都是基于它进行封装的。

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

# 前台基类

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

  • 自动根据用户token完成会员的登录和鉴权。

# 前台基类属性

新建控制器并继承于前台基类,可以直接重写这些属性。

/**
 * 无需登录的方法
 * 访问本控制器的此方法,无需会员登录
 */
protected array $noNeedLogin = [];

/**
 * 无需鉴权的方法
 */
protected array $noNeedPermission = [];

/**
 * 权限类实例
 * @var Auth
 */
protected Auth $auth = null;

# 前后台权限类实例

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

// 管理员或会员是否登录
$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余额日志模型,开启事务后,直接添加一条余额日志,会员余额会自动增减。

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积分日志模型,开启事务后,直接添加一条积分日志,会员积分会自动增减。

Db::startTrans();
try {
    UserScoreLog::create([
        'user_id' => 1,
        'score'   => 1,
        'memo'    => '测试添加 1 积分'
    ]);
    Db::commit();
} catch (Throwable $e) {
    Db::rollback();
    $this->error($e->getMessage());
}

以上的修改余额或积分中,开启事务是很关键的,因为在日志创建过程,我们封装了涉及到user表字段的修改。