摘要
tp5 框架的前置操作可以用于对某些方法进行通用的预处理,比如登录状态的判断[session 处理]、用户权限的卡控[cache/session 的处理],通过控制器的前置操作,将公用代码进行封装,简化了调用流程[直接设定前置关系即可实现前置方法的自动调用]。
protected $beforeActionList = [
'userBeforeAction1' => ['only' => 'function1NeedDoBeforeAction1, function2DoNeedBeforeAction1'],
'userBeforeAction2' => ['except' => 'function1NotNeedBeforeAction2, function2NotNeedBeforeAction2'],
'userBeforeAction3'
];
(1) only
=> 当调用 api 接口方法function1NeedDoBeforeAction1()
和function1NeedDoBeforeAction1
时,都会自动调用不公开[protected
]的前置方法userBeforeAction1()
,并且该前置方法只在访问这两个 api 方法时执行。
(2) except
=> api 接口方法function1NotNeedBeforeAction2()
和function1NotNeedBeforeAction2()
时,不会执行前置方法userBeforeAction2()
可以为某个或者某些操作指定前置执行的操作方法,设置 beforeActionList 属性可以指定某个方法为其他方法的前置操作,数组键名为需要调用的前置方法名,无值的话为当前控制器下所有方法的前置方法。
(1)由于 TP5 框架对 url 的处理是全部转化为小写,并且执行前置操作时,也是通过 url 中参数获取当前调用的 api 方法,并判断是否需要进行前置操作的,所以定义需要执行前置方法的 api 方法时,都需要使用小写[针对 TP5.0 版本]
(2)前置方法的访问方式为private
时,则无法调用。
基类控制器thinkphp\library\think\Controller.php
(1) 属性名:$beforeActionList
前置方法列表:
protected $beforeActionList = [];
(2) 构造方法:__construc()
// 遍历前置方法列表,并对每个前置方法进行前置处理
if ($this->beforeActionList) {
foreach ($this->beforeActionList as $method => $options) {
is_numeric($method) ?
$this->beforeAction($options) :
$this->beforeAction($method, $options);
}
}
【逻辑分析】:
beforeAction()
(1) 当前置方法[每组前置关系的键]是数值时 【键为数值的情况即 该组前置关系 没有指定前置方法的作用域,是对所有方法执行该前置方法】
$this->beforeAction($options)
protected function beforeAction($options)
{
call_user_func([$this, $options]);
}
(2) 当前置方法[每组前置关系的键]不是数值时
$this->beforeAction($method, $options)
protected function beforeAction($method, $options = [])
{
if (isset($options['only'])) {
if (is_string($options['only'])) {
$options['only'] = explode(',', $options['only']);
}
if (!in_array($this->request->action(), $options['only'])) {
return;
}
} elseif (isset($options['except'])) {
if (is_string($options['except'])) {
$options['except'] = explode(',', $options['except']);
}
if (in_array($this->request->action(), $options['except'])) {
return;
}
}
call_user_func([$this, $method]);
}
(3)函数 [call_user_func]功能:把第一个参数作为回调函数调用
[全程学习+笔记时长:100min]
【声明】
我的博客即将搬运同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=89fda9dsh3d0