基于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 模拟$_PUT实现代码
Mar 15 PHP
php explode函数实例代码
Feb 27 PHP
360通用php防护代码(使用操作详解)
Jun 18 PHP
Youku 视频绝对地址获取的方法详解
Jun 26 PHP
php读取本地文件常用函数(fopen与file_get_contents)
Sep 09 PHP
Laravel 5.3 学习笔记之 安装
Aug 28 PHP
利用php做服务器和web前端的界面进行交互
Oct 31 PHP
PHP实现的简单对称加密与解密方法实例小结
Aug 28 PHP
php打开本地exe程序,js打开本地exe应用程序,并传递相关参数方法
Feb 06 PHP
laravel框架数据库配置及操作数据库示例
Oct 10 PHP
自定义Laravel (monolog)日志位置,并增加请求ID的实现
Oct 17 PHP
PHP实现提取多维数组指定一列的方法总结
Dec 04 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
从wamp到xampp的升级之路
2015/04/08 PHP
PHP后台微信支付和支付宝支付开发
2017/04/28 PHP
BOOM vs RR BO5 第四场 2.14
2021/03/10 DOTA
BOM与DOM的区别分析
2010/10/26 Javascript
DB.ASP 用Javascript写ASP很灵活很好用很easy
2011/07/31 Javascript
jQuery实现页面滚动时层智能浮动定位实例探讨
2013/03/29 Javascript
jquery.post用法示例代码
2014/01/03 Javascript
分享20款美化网站的 jQuery Lightbox 灯箱插件
2014/10/10 Javascript
nodejs教程之制作一个简单的文章发布系统
2014/11/21 NodeJs
NodeJS学习笔记之(Url,QueryString,Path)模块
2015/01/13 NodeJs
jquery实现在光标位置插入内容的方法
2015/02/05 Javascript
EXT中单击button按钮grid添加一行(光标位置可设置)的实例代码
2016/06/02 Javascript
JS实现汉字与Unicode码相互转换的方法详解
2017/04/28 Javascript
echarts饼图扇区添加点击事件的实例
2017/10/16 Javascript
vue基于element-ui的三级CheckBox复选框功能的实现代码
2018/10/15 Javascript
用webpack4开发小程序的实现方法
2019/06/04 Javascript
解决webpack多页面内存溢出的方法示例
2019/10/08 Javascript
在vue-cli中引入lodash.js并使用详解
2019/11/13 Javascript
详解JavaScript类型判断的四种方法
2020/10/21 Javascript
微信小程序实现加入购物车滑动轨迹
2020/11/18 Javascript
python使用点操作符访问字典(dict)数据的方法
2015/03/16 Python
Python中zip()函数的简单用法举例
2019/09/02 Python
Django如何批量创建Model
2020/09/01 Python
布鲁明戴尔百货店:Bloomingdale’s
2016/12/21 全球购物
大专计算机个人求职的自我评价
2013/10/21 职场文书
房地产销售员的自我评价分享
2013/12/04 职场文书
爱国卫生月活动总结范文
2014/04/25 职场文书
银行主办会计岗位职责
2014/08/13 职场文书
工作粗心大意检讨书
2014/09/18 职场文书
中韩经贸翻译专业大学生职业生涯规划范文
2014/09/18 职场文书
交通事故协议书范文
2014/10/23 职场文书
独生子女证明范本
2015/06/19 职场文书
2015年全民创业工作总结
2015/07/23 职场文书
高一数学教学反思
2016/02/18 职场文书
Nginx使用X-Accel-Redirect实现静态文件下载的统计、鉴权、防盗链、限速等
2021/04/04 Servers
忆童年!用Python实现愤怒的小鸟游戏
2021/06/07 Python