基于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 相关文章推荐
一个用于MySQL的PHP XML类
Oct 09 PHP
PHP Session变量不能传送到下一页的解决方法
Nov 27 PHP
PHP操作mysql函数详解,mysql和php交互函数
May 19 PHP
解析PHP中的file_get_contents获取远程页面乱码的问题
Jun 25 PHP
PHP程序员基本要求和必备技能
May 09 PHP
php查询mssql出现乱码的解决方法
Dec 29 PHP
Yii实现自动加载类地图的方法
Apr 01 PHP
全面解读PHP的人气开发框架Laravel
Oct 15 PHP
PHP常见错误提示含义解释(实用!值得收藏)
Apr 25 PHP
thinkPHP中配置的读取与C方法详解
Dec 05 PHP
全面解析PHP面向对象的三大特征
Jun 10 PHP
PHP实现超简单的SSL加密解密、验证及签名的方法示例
Aug 28 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
Laravel如何使用Redis共享Session
2018/02/23 PHP
PHP使用DOM对XML解析处理操作示例
2019/07/04 PHP
兼容FireFox 的 js 日历 支持时间的获取
2009/03/04 Javascript
基于jQuery的图片左右无缝滚动插件
2012/05/23 Javascript
jQuery中next方法用法实例
2015/04/24 Javascript
javascript中的Function.prototye.bind
2015/06/25 Javascript
理解JavaScript中worker事件api
2015/12/25 Javascript
一起学写js Calender日历控件
2016/04/14 Javascript
详解使用JS如何制作简单的ASCII图与单极图
2017/03/31 Javascript
MUI  Scroll插件的使用详解
2017/04/13 Javascript
JS实现颜色的10进制转化成rgba格式的方法
2017/09/04 Javascript
JavaScript中运算符规则和隐式类型转换示例详解
2017/09/06 Javascript
vue.js前后端数据交互之提交数据操作详解
2018/04/24 Javascript
React为 Vue 引入容器组件和展示组件的教程详解
2018/05/03 Javascript
JS获取今天是本月第几周、本月共几周、本月有多少天、是今年的第几周、是今年的第几天的示例代码
2018/12/05 Javascript
在Vant的基础上封装下拉日期控件的代码示例
2018/12/05 Javascript
记录vue做微信自定义分享的一些问题
2019/09/12 Javascript
在vscode 中设置 vue模板内容的方法
2020/09/02 Javascript
[39:07]LGD vs VP 2018国际邀请赛淘汰赛BO3 第二场 8.21
2018/08/22 DOTA
Python命令行参数解析模块getopt使用实例
2015/04/13 Python
python中使用xlrd读excel使用xlwt写excel的实例代码
2018/01/31 Python
详解Tensorflow数据读取有三种方式(next_batch)
2018/02/01 Python
python matplotlib折线图样式实现过程
2019/11/04 Python
pycharm的python_stubs问题
2020/04/08 Python
Python装饰器的应用场景代码总结
2020/04/10 Python
Pycharm在指定目录下生成文件和删除文件的实现
2020/12/28 Python
matplotlib实现数据实时刷新的示例代码
2021/01/05 Python
基于CSS3 animation动画属性实现轮播图效果
2017/09/12 HTML / CSS
HTML5的结构和语义(3):语义性的块级元素
2008/10/17 HTML / CSS
在校生汽车维修实习自我鉴定
2013/09/19 职场文书
安全生产月宣传标语
2014/10/06 职场文书
幼儿教师小班个人总结
2015/02/05 职场文书
Python爬取科目四考试题库的方法实现
2021/03/30 Python
详解CSS不受控制的position fixed
2021/05/25 HTML / CSS
Python常用配置文件ini、json、yaml读写总结
2021/07/09 Python
经典《舰娘》游改全新动画预告 预定11月开播
2022/04/01 日漫