基于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 相关文章推荐
连接到txt文本的超链接,不直接打开而是点击后下载的处理方法
Jul 01 PHP
PHP+SQL 注入攻击的技术实现以及预防办法
Jan 27 PHP
如何获知PHP程序占用多少内存(memory_get_usage)
Sep 23 PHP
php中利用str_pad函数生成数字递增形式的产品编号
Sep 30 PHP
PHP中的Memcache详解
Apr 05 PHP
WordPress中邮件的一些修改和自定义技巧
Dec 15 PHP
php 文件下载 出现下载文件内容乱码损坏的解决方法(推荐)
Nov 16 PHP
PHP实现将多个文件中的内容合并为新文件的方法示例
Jun 10 PHP
PHP实现验证码校验功能
Nov 16 PHP
Laravel源码解析之路由的使用和示例详解
Sep 27 PHP
PHP时间日期增减操作示例【date strtotime实现加一天、加一月等操作】
Dec 21 PHP
php异常处理捕获错误整理
Sep 23 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/05/06 PHP
详解WordPress中用于合成数组的wp_parse_args()函数
2015/12/18 PHP
Laravel模型事件的实现原理详解
2018/03/14 PHP
PHP实现用session来实现记录用户登陆信息
2018/10/15 PHP
php常用字符串查找函数strstr()与strpos()实例分析
2019/06/21 PHP
JQuery 学习技巧总结
2010/05/21 Javascript
对象不支持indexOf属性或方法的解决方法(必看)
2017/05/28 Javascript
JavaScript实现简单的树形菜单效果
2017/06/23 Javascript
vue中利用Promise封装jsonp并调取数据
2019/06/18 Javascript
微信小程序 行的删除和增加操作实现详解
2019/09/29 Javascript
vue.js使用v-model实现父子组件间的双向通信示例
2020/02/05 Javascript
three.js 将图片马赛克化的示例代码
2020/07/31 Javascript
如何在vue-cli中使用css-loader实现css module
2021/01/07 Vue.js
使用Python实现下载网易云音乐的高清MV
2015/03/16 Python
Windows下Python使用Pandas模块操作Excel文件的教程
2016/05/31 Python
使用Python编写一个最基础的代码解释器的要点解析
2016/07/12 Python
Python实现定时任务
2017/02/08 Python
python的Crypto模块实现AES加密实例代码
2018/01/22 Python
Python实现二维曲线拟合的方法
2018/12/29 Python
在Pytorch中使用样本权重(sample_weight)的正确方法
2019/08/17 Python
Django ORM实现按天获取数据去重求和例子
2020/05/18 Python
Python getsizeof()和getsize()区分详解
2020/11/20 Python
django使用多个数据库的方法实例
2021/03/04 Python
美国综合购物商城:UnbeatableSale.com
2018/11/28 全球购物
澳大利亚在线批发商:Simply Wholesale
2021/02/24 全球购物
工程资料员岗位职责
2014/03/10 职场文书
土地转让协议书范本
2014/04/15 职场文书
超市活动计划书
2014/04/24 职场文书
应届生求职信范文
2014/05/26 职场文书
新文化运动的口号
2014/06/21 职场文书
公司行政主管岗位职责
2015/04/09 职场文书
小爸爸观后感
2015/06/15 职场文书
毕业实习证明范本
2015/06/16 职场文书
母亲节感言
2015/08/03 职场文书
python基于机器学习预测股票交易信号
2021/05/25 Python
高并发下Redis如何保持数据一致性(避免读后写)
2022/03/18 Redis