基于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 相关文章推荐
GD输出汉字的函数的分析
Oct 09 PHP
php split汉字
Jun 05 PHP
在mysql数据库原有字段后增加新内容
Nov 26 PHP
Ext.data.PagingMemoryProxy分页一次性读取数据的实现代码
Apr 07 PHP
php select,radio和checkbox默认选择的实现方法
May 15 PHP
对text数据类型不支持代码页转换 从: 1252 到: 936
Apr 23 PHP
Codeigniter的一些优秀特性总结
Jan 21 PHP
php中使用url传递数组的方法
Feb 11 PHP
PHP实现四种基础排序算法的运行时间比较(推荐)
Aug 11 PHP
PHP两种实现无级递归分类的方法
Mar 02 PHP
详解php中serialize()和unserialize()函数
Jul 08 PHP
php检查函数必传参数是否存在的实例详解
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
PHP实现的多彩标签效果代码分享
2014/08/21 PHP
利用Homestead快速运行一个Laravel项目的方法详解
2017/11/14 PHP
phpinfo的知识点总结
2019/10/10 PHP
php封装的page分页类完整实例代码
2020/02/01 PHP
基于PHP+Mysql简单实现了图书购物车系统的实例详解
2020/08/06 PHP
js 实现 input type="file" 文件上传示例代码
2013/08/07 Javascript
jQueryMobile之Helloworld与页面切换的方法
2015/02/04 Javascript
JS组件Bootstrap Table表格行拖拽效果实现代码
2020/08/27 Javascript
ECMAScript6快速入手攻略
2016/07/18 Javascript
AngularJS模块详解及示例代码
2016/08/17 Javascript
利用Vue.js实现checkbox的全选反选效果
2017/01/18 Javascript
jQuery ajax读取本地json文件的实例
2017/10/31 jQuery
Dropify.js图片宽高自适应的方法
2017/11/27 Javascript
小程序云开发部署攻略(图文教程)
2018/10/30 Javascript
VUE 实现复制内容到剪贴板的两种方法
2019/04/24 Javascript
Vue的生命周期操作示例
2019/09/17 Javascript
小程序实现日历左右滑动效果
2019/10/21 Javascript
微信小程序wxml列表渲染原理解析
2019/11/27 Javascript
[01:01:52]DOTA2-DPC中国联赛定级赛 SAG vs iG BO3第二场 1月9日
2021/03/11 DOTA
[05:59]带你看看DPC的台前幕后
2021/03/11 DOTA
浅谈Python实现2种文件复制的方法
2018/01/19 Python
Python使用正则表达式获取网页中所需要的信息
2018/01/29 Python
django Serializer序列化使用方法详解
2018/10/16 Python
在Python中通过getattr获取对象引用的方法
2019/01/21 Python
Python爬虫代理池搭建的方法步骤
2020/09/28 Python
使用css3实现超炫的loading加载动画效果
2014/05/07 HTML / CSS
HTML5 body设置全屏背景图片的示例代码
2020/12/08 HTML / CSS
Ootori在线按摩椅店:一家专业的按摩椅制造商
2019/04/10 全球购物
JD Sports丹麦:英国领先的运动时尚零售商
2020/11/24 全球购物
声明struct x1 { . . . }; 和typedef struct { . . . }x2;有什么不同
2012/06/02 面试题
高中体育教学反思
2014/01/29 职场文书
省优秀教师事迹材料
2014/01/30 职场文书
如何让vue长列表快速加载
2021/03/29 Vue.js
mysql 8.0.24 安装配置方法图文教程
2021/05/12 MySQL
解决MultipartFile.transferTo(dest) 报FileNotFoundExcep的问题
2021/07/01 Java/Android
使用canvas仿Echarts实现金字塔图的实例代码
2021/11/11 HTML / CSS