基于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 相关文章推荐
学习discuz php 引入文件的方法DISCUZ_ROOT
Jun 21 PHP
snoopy 强大的PHP采集类使用实例代码
Dec 09 PHP
php设计模式 Template (模板模式)
Jun 26 PHP
zf框架的校验器InArray使用示例
Mar 13 PHP
PHP中数组的分组排序实例
Jun 01 PHP
PHP反射使用实例和PHP反射API的中文说明
Jul 02 PHP
php socket实现的聊天室代码分享
Aug 16 PHP
php绘制一个扇形的方法
Jan 24 PHP
php自动更新版权信息显示的方法
Jun 19 PHP
PHP编程实现脚本异步执行的方法
Aug 09 PHP
php实现微信公众号企业转账功能
Oct 01 PHP
smarty模板的使用方法实例分析
Sep 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
国产动画《伍六七》原声大碟大卖,啊哈娱乐引领音乐赋能IP的新尝试
2020/03/08 国漫
dedecms模版制作使用方法
2007/04/03 PHP
解析PHP处理换行符的问题 \r\n
2013/06/13 PHP
PHP 关于访问控制的和运算符优先级介绍
2013/07/08 PHP
php使用ob_flush不能每隔一秒输出原理分析
2015/06/02 PHP
thinkPHP删除前弹出确认框的简单实现方法
2016/05/16 PHP
DIV外区域Click后关闭DIV的实现代码
2011/12/21 Javascript
使用变量动态设置js的属性名
2014/10/19 Javascript
javascript绘制漂亮的心型线效果完整实例
2016/02/02 Javascript
jQuery Easyui datagrid/treegrid 清空数据
2016/07/09 Javascript
BOM系列第三篇之定时器应用(时钟、倒计时、秒表和闹钟)
2016/08/17 Javascript
用js实现简单算法的实例代码
2016/09/24 Javascript
jQuery Easyui datagrid连续发送两次请求问题
2016/12/13 Javascript
node.js中http模块和url模块的简单介绍
2017/10/06 Javascript
微信小程序之多文件下载的简单封装示例
2018/01/29 Javascript
javaScript中"=="和"==="的区别详解
2018/03/16 Javascript
node.js调用C++函数的方法示例
2018/09/21 Javascript
手动下载Chrome并解决puppeteer无法使用问题
2018/11/12 Javascript
webpack4.x下babel的安装、配置及使用详解
2019/03/07 Javascript
Vue使用Clipboard.JS在h5页面中复制内容实例详解
2019/09/03 Javascript
浅析微信小程序modal弹窗关闭默认会执行cancel问题
2019/10/14 Javascript
[10:39]DOTA2上海特级锦标赛音乐会纪录片
2016/03/21 DOTA
Python写入数据到MP3文件中的方法
2015/07/10 Python
Python中列表元素转为数字的方法分析
2016/06/14 Python
TensorFlow的权值更新方法
2018/06/14 Python
pytorch 转换矩阵的维数位置方法
2018/12/08 Python
pyqt5数据库使用详细教程(打包解决方案)
2020/03/25 Python
MONNIER Frères英国官网:源自巴黎女士奢侈品配饰电商平台
2018/12/06 全球购物
英国当代时尚和街头服饰店:18montrose
2018/12/15 全球购物
白俄罗斯在线大型超市:e-dostavka.by
2019/07/25 全球购物
夫妻分居协议书范本
2014/11/28 职场文书
单位收入证明范本
2015/06/18 职场文书
2015领导干部廉洁自律工作总结
2015/07/23 职场文书
礼貌问候语大全
2015/11/10 职场文书
2016年教育局“我们的节日——端午节”主题活动总结
2016/04/01 职场文书
浅谈@Value和@Bean的执行顺序问题
2021/06/16 Java/Android