基于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获取后台Job管理的实现代码
Jun 10 PHP
php引用传值实例详解学习
Nov 06 PHP
php遍历文件夹所有文件子文件夹函数代码
Nov 27 PHP
PHP mkdir()无写权限的问题解决方法
Jun 19 PHP
Javascript与PHP验证用户输入URL地址是否正确
Oct 09 PHP
Yii不依赖Model的表单生成器用法实例
Dec 04 PHP
typecho插件编写教程(四):插件挂载
May 28 PHP
46 个非常有用的 PHP 代码片段
Feb 16 PHP
详解php中空字符串和0之间的关系
Oct 23 PHP
Laravel 5.5基于内置的Auth模块实现前后台登陆详解
Dec 21 PHP
PHP进阶学习之垃圾回收机制详解
Jun 18 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
信用卡效验程序
2006/10/09 PHP
封装一个PDO数据库操作类代码
2009/09/09 PHP
采集邮箱的php代码(抓取网页中的邮箱地址)
2012/07/17 PHP
PHP设计模式之观察者模式(Observer)详细介绍和代码实例
2014/04/08 PHP
php删除数组中重复元素的方法
2015/12/22 PHP
js+css在交互上的应用
2010/07/18 Javascript
深入解析contentWindow, contentDocument
2013/07/04 Javascript
利用JS实现浏览器的title闪烁
2013/07/08 Javascript
window.print打印指定div实例代码
2013/12/13 Javascript
Ubuntu中搭建Nodejs开发环境过程分享
2014/06/01 NodeJs
浅谈jQuery异步对象(XMLHttpRequest)
2014/11/17 Javascript
javascript跨域总结之window.name实现的跨域数据传输
2015/11/01 Javascript
快速学习jQuery插件 jquery.validate.js表单验证插件使用方法
2015/12/01 Javascript
nodejs实现bigpipe异步加载页面方案
2016/01/26 NodeJs
js实现页面跳转的五种方法推荐
2016/03/10 Javascript
JavaScript实战之菜单特效
2016/08/16 Javascript
jQuery使用方法
2017/02/04 Javascript
javascript 动态生成css代码的两种方法
2017/03/17 Javascript
react开发教程之React 组件之间的通信方式
2017/08/12 Javascript
vue2.0 axios跨域并渲染的问题解决方法
2018/03/08 Javascript
详解vuex中action何时完成以及如何正确调用dispatch的思考
2019/01/21 Javascript
微信小程序实现多行文字超出部分省略号显示功能
2019/10/23 Javascript
python算法学习之计数排序实例
2013/12/18 Python
Python3通过Luhn算法快速验证信用卡卡号的方法
2015/05/14 Python
Python编程对列表中字典元素进行排序的方法详解
2017/05/26 Python
pytorch numpy list类型之间的相互转换实例
2019/08/18 Python
CSS3实现银灰色动画效果的导航菜单代码
2015/09/01 HTML / CSS
英国最大的体育&时尚零售公司:JD Sports
2017/12/13 全球购物
市场营销毕业生自荐信范文
2014/04/01 职场文书
会议室标语
2014/06/21 职场文书
先进班集体申报材料
2014/12/26 职场文书
导游词之香港-太平山顶
2019/10/18 职场文书
教你利用python实现企业微信发送消息
2021/05/23 Python
pytorch 梯度NAN异常值的解决方案
2021/06/05 Python
Python多个MP4合成视频的实现方法
2021/07/16 Python