基于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 相关文章推荐
PHP4 与 MySQL 数据库操作函数详解
Oct 09 PHP
PHP脚本的10个技巧(7)
Oct 09 PHP
PHP学习之数组值的操作
Apr 17 PHP
php中的boolean(布尔)类型详解
Oct 28 PHP
ECshop 迁移到 PHP7版本时遇到的兼容性问题
Feb 15 PHP
PHP实现根据时间戳获取周几的方法
Feb 26 PHP
ucenter中词语过滤原理分析
Jul 13 PHP
YII框架中搜索分页jQuery写法详解
Dec 19 PHP
微信封装的调用微信签名包的类库
Jun 08 PHP
详解PHP防止直接访问.php 文件的实现方法
Jul 28 PHP
thinkphp5.1 文件引入路径问题及注意事项
Jun 13 PHP
你真的了解PHP中的引用符号(&)吗
May 12 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实现手机归属地查询API接口实现代码
2012/08/27 PHP
深入探讨:PHP使用数据库永久连接方式操作MySQL的是与非
2013/06/05 PHP
php基于表单密码验证与HTTP验证用法实例
2015/01/06 PHP
PHP 获取ip地址代码汇总
2015/07/05 PHP
写了10年的Javascript也未必全了解的连续赋值运算
2011/03/25 Javascript
javascript 45种缓动效果 非常酷
2011/06/28 Javascript
js展开闭合效果演示代码
2013/07/24 Javascript
使用JS获取当前地理位置方法汇总
2014/12/18 Javascript
由ReactJS的Hello world说开来
2015/07/02 Javascript
鼠标经过子元素触发mouseout,mouseover事件的解决方案
2015/07/26 Javascript
javascript实现简易计算器的代码
2016/05/31 Javascript
详解BootStrap中Affix控件的使用及保持布局的美观的方法
2016/07/08 Javascript
JavaScript原生实现观察者模式的示例
2017/12/15 Javascript
JavaScript中的E-mail 地址格式验证
2018/03/28 Javascript
vue2.0 实现导航守卫的具体用法(路由守卫)
2018/05/17 Javascript
vuex如何重置所有state(可定制)
2019/01/17 Javascript
vue.js的vue-cli脚手架中使用百度地图API的实例
2019/01/21 Javascript
Vue使用JSEncrypt实现rsa加密及挂载方法
2020/02/07 Javascript
Vue按时间段查询数据组件使用详解
2020/08/21 Javascript
Vue实现todo应用的示例
2021/02/20 Vue.js
[03:12]完美世界DOTA2联赛PWL DAY7集锦
2020/11/06 DOTA
Python操作MongoDB数据库的方法示例
2018/01/04 Python
Python实现的维尼吉亚密码算法示例
2018/04/12 Python
Django框架下静态模板的继承操作示例
2019/11/08 Python
Python之指数与E记法的区别详解
2019/11/21 Python
如何基于python对接钉钉并获取access_token
2020/04/21 Python
汇科协同Java笔试题
2012/03/31 面试题
市场营销毕业生自荐信
2013/11/23 职场文书
球队口号
2014/06/18 职场文书
党员对照检查材料思想汇报(党的群众路线)
2014/09/24 职场文书
社区五一劳动节活动总结
2015/02/09 职场文书
2015驻村干部工作总结
2015/04/07 职场文书
学校食堂食品安全承诺书
2015/04/29 职场文书
MySQL中日期型单行函数代码详解
2021/06/21 MySQL
JavaScript 中for/of,for/in 的详细介绍
2021/11/17 Javascript
解决spring.thymeleaf.cache=false不起作用的问题
2022/06/10 Java/Android