基于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 is_file 判断给定文件名是否为一个正常的文件
May 10 PHP
PHP通用检测函数集合
Feb 08 PHP
无需重新编译php加入ftp扩展的解决方法
Feb 07 PHP
慎用preg_replace危险的/e修饰符(一句话后门常用)
Jun 19 PHP
解析php获取字符串的编码格式的方法(函数)
Jun 21 PHP
PHP扩展CURL的用法详解
Jun 20 PHP
php发送与接收流文件的方法
Feb 11 PHP
php、mysql查询当天,查询本周,查询本月的数据实例(字段是时间戳)
Feb 04 PHP
PHP排序二叉树基本功能实现方法示例
May 26 PHP
thinkPHP中U方法加密传递参数功能示例
May 29 PHP
thinkPHP5.1框架使用SemanticUI实现分页功能示例
Aug 03 PHP
PHP如何防止用户重复提交表单
Dec 09 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邮件发送,php发送邮件的类
2011/03/24 PHP
PHP的变量总结 新手推荐
2011/04/18 PHP
php中mysql模块部分功能的简单封装
2011/09/30 PHP
php fsockopen中多线程问题的解决办法[翻译]
2011/11/09 PHP
php获取用户IPv4或IPv6地址的代码
2012/11/15 PHP
PHP中strlen()和mb_strlen()的区别浅析
2014/06/19 PHP
phpstorm配置Xdebug进行调试PHP教程
2014/12/01 PHP
JQuery实现可直接编辑的表格
2015/04/16 Javascript
JavaScript前端开发之实现二进制读写操作
2015/11/04 Javascript
移动适配的几种方案(三种方案)
2016/11/25 Javascript
JS中的phototype详解
2017/02/04 Javascript
JS实现运动缓冲效果的封装函数示例
2018/02/18 Javascript
Vue项目中设置背景图片方法
2018/02/21 Javascript
Angularjs实现数组随机排序的方法
2018/10/02 Javascript
详解JS浏览器事件循环机制
2019/03/27 Javascript
vue实现页面滚动到底部刷新
2019/08/16 Javascript
使用zrender.js绘制体温单效果
2019/10/31 Javascript
微信小程序picker组件两列关联使用方式
2020/10/27 Javascript
JavaScript代码实现微博批量取消关注功能
2021/02/05 Javascript
Python 利用内置set函数对字符串和列表进行去重的方法
2018/06/29 Python
详解pandas安装若干异常及解决方案总结
2019/01/10 Python
Python饼状图的绘制实例
2019/01/15 Python
python列表的逆序遍历实现
2020/04/20 Python
Django如何在不停机的情况下创建索引
2020/08/02 Python
英国街头品牌:Bee Inspired Clothing
2018/02/12 全球购物
机械设计及其自动化专业推荐信
2013/10/31 职场文书
营销与策划专业毕业生求职信
2013/11/01 职场文书
自主招生自荐信范文
2013/12/04 职场文书
写自荐信要注意什么
2013/12/26 职场文书
最新茶叶店创业计划书
2014/01/14 职场文书
拾金不昧表扬信
2015/01/16 职场文书
2015年公共机构节能宣传周活动总结
2015/03/26 职场文书
党员读书活动心得体会
2016/01/14 职场文书
撤回我也能看到!教你用Python制作微信防撤回脚本
2021/06/11 Python
Python如何解决secure_filename对中文不支持问题
2021/07/16 Python
JavaScript流程控制(循环)
2021/12/06 Javascript