基于Laravel 多个中间件的执行顺序详解


Posted in PHP onOctober 21, 2019

问题

一个路由需要用到多个中间件,其中一个是 Laravel 自带的 auth 中间件。

发现这个中间件不管放在哪里,总是在自定义中间件之前执行。

如果业务需要自定义中间在 auth 之前执行,还是有办法的。

解决方案

观察定义中间件的 app\Http\Kernel 类,是继承的 Illuminate\Foundation\Http\Kernel 类。

再打开 Illuminate\Foundation\Http\Kernel ,发现有这样一个数组

...

  /**
   * The priority-sorted list of middleware.
   *
   * Forces the listed middleware to always be in the given order.
   *
   * @var array
   */
  protected $middlewarePriority = [
    \Illuminate\Session\Middleware\StartSession::class,
    \Illuminate\View\Middleware\ShareErrorsFromSession::class,
    \Illuminate\Auth\Middleware\Authenticate::class,
    \Illuminate\Session\Middleware\AuthenticateSession::class,
    \Illuminate\Routing\Middleware\SubstituteBindings::class,
    \Illuminate\Auth\Middleware\Authorize::class,
  ];

  ...

注释里写得比较清楚了:列表中的中间件会按照顺序优先在其他中间件之前执行。

那么需要自定义中间件在 auth 之前执行,只需要在 app\Http\Kernel 重载这个数组就行了。

auth 中间件对应的类 \Illuminate\Auth\Middleware\Authenticate,

将自定义中间件 \App\Http\Middleware\CustomMiddelware 放到这个前面就可以了:

...

  protected $middlewarePriority = [
    \Illuminate\Session\Middleware\StartSession::class,
    \Illuminate\View\Middleware\ShareErrorsFromSession::class,
    \App\Http\Middleware\CustomMiddelware::class,
    \Illuminate\Auth\Middleware\Authenticate::class,
    \Illuminate\Session\Middleware\AuthenticateSession::class,
    \Illuminate\Routing\Middleware\SubstituteBindings::class,
    \Illuminate\Auth\Middleware\Authorize::class,
  ];

  ...

拓展

不在 $middlewarePriority 列表中的中间件,是按照在路由配置里调用的顺序来的:

在 Route::group 里定义的,先执行外层,后执行内层

在数组定义的,先执行写在数组前面的,后执行写在数组后面的

举例:

Route::group(['middleware' => 'outer'], function () {
  Route::group(['middleware' => 'inner'], function () {
    Route::group(['middleware' => ['array1', 'array2', 'auth:api']], function () {
      Route::get('test', function () {
        return;
      });
    });
  });
});

这里就是按照 outer 、 inner 、 array1 、 array2 的顺序执行。

以上这篇基于Laravel 多个中间件的执行顺序详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
PHP音乐采集(部分代码)
Feb 14 PHP
fetchAll()与mysql_fetch_array()的区别详解
Jun 05 PHP
PHP 线程安全与非线程安全版本的区别深入解析
Aug 06 PHP
php根据日期判断星座的函数分享
Feb 13 PHP
PHP反向代理类代码
Aug 15 PHP
WordPress中Gravatar头像缓存到本地及相关优化的技巧
Dec 19 PHP
php单链表实现代码分享
Jul 04 PHP
php中实现进程锁与多进程的方法
Sep 18 PHP
php简单实现多维数组排序的方法
Sep 30 PHP
PHP基于自增数据如何生成不重复的随机数示例
May 19 PHP
PHP实现微信提现功能(微信商城)
Nov 21 PHP
PHP时间类完整代码实例
Feb 26 PHP
laravel利用中间件做防非法登录和权限控制示例
Oct 21 #PHP
laravel 实现关闭CSRF(全部关闭、部分关闭)
Oct 21 #PHP
laravel csrf排除路由,禁止,关闭指定路由的例子
Oct 21 #PHP
laravel 实现上传图片到本地和前台访问示例
Oct 21 #PHP
浅谈laravel-admin form中的数据,在提交后,保存前,获取并进行编辑
Oct 21 #PHP
Laravel 之url参数,获取路由参数的例子
Oct 21 #PHP
关于laravel-admin ueditor 集成并解决刷新的问题
Oct 21 #PHP
You might like
利用php来自动调用不同服务器上的flash
2006/10/09 PHP
深入理解PHP之数组(遍历顺序)  Laruence原创
2012/06/13 PHP
浅谈laravel aliases别名的原理
2019/10/24 PHP
js文件中调用js的实现方法小结
2009/10/23 Javascript
JS判断是否为数字,是否为整数,是否为浮点数的代码
2010/04/24 Javascript
jqgrid 简单学习笔记
2011/05/03 Javascript
js控制web打印(局部打印)方法整理
2013/05/29 Javascript
得到form下的所有的input的js代码
2013/11/07 Javascript
javascript使用shift+click实现选择和反选checkbox的方法
2015/05/04 Javascript
浅谈时钟的生成(js手写简洁代码)
2016/08/20 Javascript
Vue.js仿微信聊天窗口展示组件功能
2017/08/11 Javascript
jQuery+Cookie实现切换皮肤功能【附源码下载】
2018/03/25 jQuery
vue使用混入定义全局变量、函数、筛选器的实例代码
2019/07/29 Javascript
Vue项目中如何使用Axios封装http请求详解
2019/10/23 Javascript
JQuery常用简单动画操作方法回顾与总结
2019/12/07 jQuery
[03:56]还原FTP电影首映式 DOTA2群星拼出遗迹世界
2014/03/26 DOTA
[00:53]2015国际邀请赛 中国区预选赛一触即发
2015/05/14 DOTA
Python with的用法
2014/08/22 Python
Python实现发送与接收邮件的方法详解
2018/03/28 Python
Python异常处理操作实例详解
2018/05/10 Python
Python+selenium 获取一组元素属性值的实例
2018/06/22 Python
Flask框架Flask-Login用法分析
2018/07/23 Python
flask中过滤器的使用详解
2018/08/01 Python
python3.6+django2.0+mysql搭建网站过程详解
2019/07/24 Python
关于python导入模块import与常见的模块详解
2019/08/28 Python
python中wx模块的具体使用方法
2020/05/15 Python
html5 application cache遇到的严重问题
2012/12/26 HTML / CSS
HTML5 视频播放(video),JavaScript控制视频的实例代码
2018/10/08 HTML / CSS
雅诗兰黛旗下走天然植物路线的彩妆品牌:Prescriptives
2016/08/14 全球购物
漫威玩具服装及周边商品官方购物网站:Marvel Shop
2019/05/11 全球购物
如何向接受结构参数的函数传入常数值
2016/02/17 面试题
解释一下Windows的消息机制
2014/01/30 面试题
安全生产责任书范本
2014/04/15 职场文书
2016应届毕业生自荐信范文
2016/01/28 职场文书
浅谈MySQL表空间回收的正确姿势
2021/10/05 MySQL
Python anaconda安装库命令详解
2021/10/16 Python