基于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 函数学习简单小结
Jul 08 PHP
destoon二次开发入门示例
Jun 20 PHP
如何让CI框架支持service层
Oct 29 PHP
浅谈PHP解析URL函数parse_url和parse_str
Nov 11 PHP
php中heredoc与nowdoc介绍
Dec 25 PHP
PHP使用ODBC连接数据库的方法
Jul 18 PHP
php实现微信发红包
Dec 05 PHP
浅析Yii2集成富文本编辑器redactor实例教程
Apr 25 PHP
Win7环境下Apache连接MySQL提示连接已重置的解决办法
May 09 PHP
python进程与线程小结实例分析
Nov 11 PHP
PHP后期静态绑定实例浅析
Dec 21 PHP
PHP PDOStatement::nextRowset讲解
Feb 01 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基于str_pad实现卡号不足位数自动补0的方法
2014/11/12 PHP
PHP+MySql+jQuery实现的"顶"和"踩"投票功能
2016/05/21 PHP
jquery获取input表单值的代码
2010/04/19 Javascript
js判断一个元素是否为另一个元素的子元素的代码
2012/03/21 Javascript
关于include标签导致js路径找不到的问题分析及解决
2013/07/09 Javascript
jQuery仿360导航页图标拖动排序效果代码分享
2015/08/24 Javascript
js实现精确到秒的倒计时效果
2016/05/29 Javascript
值得分享的bootstrap table实例
2016/09/22 Javascript
seajs模块之间依赖的加载以及模块的执行
2016/10/21 Javascript
微信小程序 wxapp画布 canvas详细介绍
2016/10/31 Javascript
详解js前端代码异常监控
2017/01/11 Javascript
vue实现todolist单页面应用
2017/04/11 Javascript
JS运动特效之同时运动实现方法分析
2018/01/24 Javascript
vue 登录滑动验证实现代码
2018/08/24 Javascript
vue+iview 兼容IE11浏览器的实现方法
2019/01/07 Javascript
JS实现计算小于非负数n的素数的数量算法示例
2019/02/26 Javascript
JS实现页面跳转与刷新的方法汇总
2019/08/30 Javascript
vue实现短信验证码登录功能(流程详解)
2019/12/10 Javascript
js获取url页面id,也就是最后的数字文件名
2020/09/25 Javascript
解析Python中的eval()、exec()及其相关函数
2017/12/20 Python
Python后台开发Django的教程详解(启动)
2019/04/08 Python
Python利用sqlacodegen自动生成ORM实体类示例
2019/06/04 Python
利用Pytorch实现简单的线性回归算法
2020/01/15 Python
毕业生求职简历中的自我评价
2013/10/18 职场文书
毕业自我鉴定
2013/11/05 职场文书
售后专员岗位职责
2013/12/08 职场文书
大三毕业自我鉴定
2014/01/15 职场文书
企业车辆管理制度
2014/01/24 职场文书
市三好学生主要事迹
2014/01/28 职场文书
幼儿园毕业园长感言
2014/02/24 职场文书
应届毕业生求职信范文
2014/05/08 职场文书
运动会加油稿100字
2014/09/19 职场文书
教师政风行风自查自纠报告
2014/10/21 职场文书
欢送会主持词
2015/07/01 职场文书
结婚主持人致辞
2015/07/28 职场文书
简述python四种分词工具,盘点哪个更好用?
2021/04/13 Python