设为首页收藏本站

安徽论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 11403|回复: 0

ThinkPHP6.0前置、后置中间件区别

[复制链接]

85

主题

0

回帖

267

积分

中级会员

Rank: 3Rank: 3

积分
267
发表于 2022-3-26 10:59:55 | 显示全部楼层 |阅读模式
网站内容均来自网络,本站只提供信息平台,如有侵权请联系删除,谢谢!
目录


1. 创建中间件

命令行创建中间件类文件示例
  1. // app\middleware\Auth
  2. php think make:middleware Auth

  3. // app\middleware\admin\Auth
  4. php think make:middleware admin/Auth

  5. // app\admin\middleware\Auth
  6. php think make:middleware admin@Auth

  7. // pp\admin\middleware\login\Auth
  8. php think make:middleware admin@login/Auth
复制代码
本文使用的是
  1. php think make:middleware admin@Auth
复制代码
2. 注册中间件

创建中间件类文件后,就可以根据应用场景去注册中间件了
注册中间件分为四种类型: 全局中间件、应用中间件、路由中间件、控制器中间件
本文以最常见的场景为例: 将应用中间件作为登录流拦截器, 来说明前置中间件和后置中间件的区别


3. 前置、后置中间件

一个中间件是前置中间件还是后置中间件,看的是中间件执行代码在请求之前执行还是请求之后执行
请求指的是
  1. $next($request)
复制代码
,中间件执行代码在请求之前执行称为前置中间件,在请求之后执行称为后置中间件
前置中间件: 中间件执行代码在
  1. $next($request)
复制代码
前面执行,如下图所示

后置中间件: 中间件执行代码在
  1. $next($request)
复制代码
后面执行,如下图所示


4. 前置、后置中间件的区别

区别一: 在前置中间件中使用
  1. $request->controller()
复制代码
获取不到访问的控制器名,而在后置中间件中则可以正常获取到

在前置中间件打印
  1. $request
复制代码
发现是获取不到访问的控制器和方法名

在后置中间件打印
  1. $request
复制代码
可以获取到访问的控制器和方法名

区别二: 前置中间件没有执行控制器中的代码,而后置中间件则执行了
后置中间件存在的问题: 虽然能拦截,但是控制器中的代码已经执行了,因为调用
  1. $next($request)
复制代码
, 相当于执行控制器方法
如下图所示,在控制器方法中往文件中写入了一条数据,使用后置中间件时即使被拦截也会执行文件写入,所以使用后置中间拦截其实没有意义的,我们应该使用前置中间件进行拦截
后置中间件、控制器方法如下图所示


查看网页源代码,页面上输出的值如下所示
  1. middleware start
  2. 业务逻辑
  3. middleware ing
  4. 方法返回值
复制代码
而不是
  1. middleware start
  2. middleware ing
  3. 业务逻辑
  4. 方法返回值
复制代码
5. 后置中间件登录拦截器(不推荐)
  1. public function handle($request, \Closure $next){    $response = $next($request);    $noCheck = ['login']; // 不做登陆校验的控制器    $controller = parse_name($request->controller());    if (!session('?admin') && !in_array($controller, $noCheck)) {        return redirect(url('admin/login'));    }    return $response;}
复制代码
6. 前置中间件登录拦截器(推荐使用)

在前置中间件中无法使用
  1. $request->controller()
复制代码
获取控制器名,但可以使用
  1. $request->pathinfo()
复制代码
获取当前路由地址
  1. public function handle($request, \Closure $next){    if (empty(session('admin')) && !preg_match('/login/', $request->pathinfo())) {        return redirect((string)url('login/index'));    }    return $next($request);}
复制代码
到此这篇关于ThinkPHP6.0前置、后置中间件区别的文章就介绍到这了,更多相关ThinkPHP6.0前置后置中间件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
                                                        
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
免责声明
1. 本论坛所提供的信息均来自网络,本网站只提供平台服务,所有账号发表的言论与本网站无关。
2. 其他单位或个人在使用、转载或引用本文时,必须事先获得该帖子作者和本人的同意。
3. 本帖部分内容转载自其他媒体,但并不代表本人赞同其观点和对其真实性负责。
4. 如有侵权,请立即联系,本网站将及时删除相关内容。
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表