# 控制器

阅读此文档,需要对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类来实现查询添加编辑等功能。

# 后台基类属性

父类可以直接重写这些属性。

/**
 * 无需登录的方法
 * 访问本控制器的此方法,无需管理员登录
 */
protected $noNeedLogin      = ['index', 'login'];

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

/**
 * 新增/编辑时,对前端发送的字段进行排除(忽略不入库)
 */
protected $preExcludeFields = ['createtime', 'updatetime'];

/**
 * 权重字段,拖拽排序依据字段
 */
protected $weighField = 'weigh';

/**
 * 在查看数据时的:默认的排序字段
 */
protected $defaultSortField = 'id,desc';

/**
 * 快速搜索字段
 */
protected $quickSearchField = 'id';

/**
 * 是否开启模型验证
 */
protected $modelValidate = true;

/**
 * 是否开启模型场景验证
 */
protected $modelSceneValidate = false;

/**
 * 关联查询方法名
 * 方法应定义在模型中
 */
protected $withJoinTable = [];

/**
 * 关联查询JOIN方式
 */
protected $withJoinType = 'LEFT';

/**
 * 开启数据限制
 * false=关闭
 * personal=仅限个人
 * allAuth=拥有某管理员所有的权限时
 * allAuthAndOthers=拥有某管理员所有的权限并且还有其他权限时
 * parent=上级分组中的管理员可查
 * 指定分组中的管理员可查,比如 $dataLimit = 2;// 2为分组id号
 * 启用请确保数据表内存在 admin_id 字段,可以查询/编辑数据的管理员为admin_id对应的管理员+数据限制所表示的管理员们
 */
protected $dataLimit = false;

/**
 * 数据限制字段
 */
protected $dataLimitField = 'admin_id';

/**
 * 数据限制开启时自动填充字段值为当前管理员id
 */
protected $dataLimitFieldAutoFill = true;

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

# 后台Trait

我们准备了app\admin\library\traits\BackendTrait类,前台发送的查询添加编辑删除排序操作都是通过此类实现的。

# 新建后台控制器

当我们要新建一个控制器时,建议首先让它继承于app\common\controller\Backend类,之后,如果我们需要重写查询添加编辑等来自Trait类的方法,请复制Trait类的方法到控制器后进行重写即可。

# 前台基类

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

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

# 前台基类属性

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

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

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

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

# 前后台权限类实例

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

WARNING

若有编程修改会员余额的需要,请勿直接操作会员余额字段,请通过app\admin\model\UserMoneyLog用户余额日志模型,直接添加一条余额日志,会员余额会自动增减。

// 管理员或会员是否登录
$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();