专栏首页程序小工【TP5深入理解】控制器(三)--前置操作

【TP5深入理解】控制器(三)--前置操作

摘要

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 属性可以指定某个方法为其他方法的前置操作,数组键名为需要调用的前置方法名,无值的话为当前控制器下所有方法的前置方法。

控制器类属性: $beforeActionList

属性值: 键值对

  • 键:前置方法名
  • 值:前置方法作用域[键值对|无]
    • 无值时: 对当前控制器所有 api 方法都执行前置
    • 有值[键值对]:
      • 键:
        • except:除某些 api 方法执行前置
        • only:只对某些 api 方法执行前置
      • 值:需要进行前置操作的 api 方法 [当该项值为多个时,用半角,进行间隔]

【注意点】:

(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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 【React入门】实现todolist功能

    作为一名 PHP 初级的程序员,目前尚且处于学习 PHP 业务逻辑实现到日常工作中的阶段,但是由于现在想要搭建一个满意的个人博客,并且尝试过很多 hexo 主题...

    程序小工
  • 【转】Windows系统下的高效工具

    Mac 之所以 高效,实际上是藉其自带特色功能以及原生的命令行支持 (当然也有它脑残的一面,例如:自带的窗口管理基本没带;新建文件只能使用命令 touch ·...

    程序小工
  • Composer设置国内镜像

    使用 composer 时,输入命令执行后半天没有反应,并最后是失败的消息。如下载项目中的框架文件时: composer install 一直没有反应

    程序小工
  • 「docker实战篇」python的docker爬虫技术-fiddler之安卓模拟器如何抓包(九)

    PS:fiddler完成对app夜神浏览器的监控完成。其实不复杂。没搞过的可能感觉比较麻烦。

    IT故事会
  • Linux 下通过命令行连接 WiFi

    Kali Linux 默认使用 Gnome 桌面环境,而在 Gnome 的顶部菜单栏中是可以直接选择无线网络并建立连接的,这就像在 Window...

    悠风
  • 【JS】328- 8个你不知道的DOM功能

    最近一直在关注工具,从 React 和 npm-install-everything 中休息一下,看看一些原生的 DOM 和 Web API 的功能,他们可以在...

    pingan8787
  • 【GAN全局实用手册】谷歌大脑最新研究,Goodfellow力荐

    【新智元导读】随着GAN越来越多的应用到实际研究当中,其技术中的缺陷与漏洞也随之出现。从实际角度对GAN的当前状态进行深入挖掘与理解就显得格外重要。来自Goog...

    新智元
  • winfrom如何在listview中添加控件

    private Button btn = new Button(); private void Form1_Load(objec...

    码农阿宇
  • Hexo快速构建个人小站-Fulid主题下添加Valine评论系统(三)

    前面两章完成了Hexo的初始化和部分自定义的功能,对于只想展示文章来说也是没有问题的,但是无法与读者进行互动,无论读者对错误的反馈还是对优质内容的鼓励这些统统都...

    Peyshine
  • 分享 15 个好用 + 实用的 Chrome 扩展

    使用浏览器扩展程序可以使你的工作效率提高数倍不止,那么下面我就向大家分享一下我日常使用的扩展,可能大多数扩展大家都已经在使用了,不过也难免有一两个是你不知道的。

    芋道源码

扫码关注云+社区

领取腾讯云代金券