基于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中实现图片的锐化
Oct 09 PHP
一些常用的php函数
Dec 06 PHP
php面向对象全攻略 (六)__set() __get() __isset() __unset()的用法
Sep 30 PHP
PHP下打开phpMyAdmin出现403错误的问题解决方法
May 23 PHP
浅谈php优化需要注意的地方
Nov 27 PHP
php简单实现无限分类树形列表的方法
Mar 27 PHP
PHP中使用hidef扩展代替define提高性能
Apr 09 PHP
ThinkPHP开发框架函数详解:C方法
Aug 14 PHP
如何使用GDB调试PHP程序
Dec 08 PHP
php实时倒计时功能实现方法详解
Feb 27 PHP
php实现网页上一页下一页翻页过程详解
Jun 28 PHP
通过实例解析PHP数据类型转换方法
Jul 11 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 has encountered an Access Violation at 7C94BD02解决方法
2009/08/24 PHP
php强大的时间转换函数strtotime
2016/02/18 PHP
PHP开发的微信现金红包功能示例
2017/06/29 PHP
php获得刚插入数据的id 的几种方法总结
2018/05/31 PHP
在网页中屏蔽快捷键
2006/09/06 Javascript
Prototype使用指南之array.js
2007/01/10 Javascript
javascript中的float运算精度实例分析
2010/08/21 Javascript
完美兼容各大浏览器的jQuery仿新浪图文淡入淡出间歇滚动特效
2014/11/12 Javascript
js简单实现表单中点击按钮动态增加输入框数量的方法
2015/08/18 Javascript
JavaScript继承模式粗探
2016/01/12 Javascript
JS实现六边形3D拖拽翻转效果的方法
2016/09/11 Javascript
es6的数字处理的方法(5个)
2017/03/16 Javascript
react以create-react-app为基础创建项目
2018/03/14 Javascript
create-react-app 修改为多入口编译的方法
2018/08/01 Javascript
在SSM框架下用laypage和ajax实现分页和数据交互的方法
2019/09/27 Javascript
Vue-drag-resize 拖拽缩放插件的使用(简单示例)
2019/12/04 Javascript
[07:12]2014DOTA2西雅图国际邀请赛 黑马Liquid专题采访
2014/07/12 DOTA
Python生成随机验证码的两种方法
2015/12/22 Python
Windows中安装使用Virtualenv来创建独立Python环境
2016/05/31 Python
Python基于Tensor FLow的图像处理操作详解
2020/01/15 Python
python GUI库图形界面开发之PyQt5树形结构控件QTreeWidget详细使用方法与实例
2020/03/02 Python
Python获取对象属性的几种方式小结
2020/03/12 Python
python中使用input()函数获取用户输入值方式
2020/05/03 Python
Pygame的程序开始示例代码
2020/05/07 Python
中文系学生自荐信范文
2013/11/13 职场文书
超市后勤自我鉴定
2014/01/17 职场文书
经营目标管理责任书
2014/07/25 职场文书
局领导领导班子四风对照检查材料
2014/09/27 职场文书
重阳节慰问信
2015/02/15 职场文书
2019各种承诺书范文
2019/06/24 职场文书
创业计划书之外语培训班
2019/11/02 职场文书
Django程序的优化技巧
2021/04/29 Python
MYSQL数据库使用UTF-8中文编码乱码的解决办法
2021/05/26 MySQL
JS实现简单的九宫格抽奖
2022/06/28 Javascript
maven 解包依赖项中的文件的解决方法
2022/07/15 Java/Android
Python TypeError: ‘float‘ object is not subscriptable错误解决
2022/12/24 Python