基于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 相关文章推荐
使用sockets:从新闻组中获取文章(一)
Oct 09 PHP
PHP分页显示制作详细讲解
Dec 05 PHP
PHP通过正则表达式下载图片到本地的实现代码
Sep 19 PHP
用PHP实现Ftp用户的在线管理
Feb 16 PHP
深入理解PHP几个算法:PHP冒泡、PHP二分法、PHP求素数、PHP乘法表
Jun 06 PHP
浅析php中三个等号(===)和两个等号(==)的区别
Aug 06 PHP
ThinkPHP之M方法实例详解
Jun 20 PHP
PHP 读取和编写 XML
Nov 19 PHP
PHP中使用break跳出多重循环代码实例
Jan 21 PHP
PHP魔术方法使用方法汇总
Feb 14 PHP
PHP编写的图片验证码类文件分享
Jun 06 PHP
PHP如何获取Cookie并实现模拟登录
Jul 16 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的输入输出流
2007/02/14 PHP
《PHP编程最快明白》第四讲:日期、表单接收、session、cookie
2010/11/01 PHP
如何给phpcms v9增加类似于phpcms 2008中的关键词表
2013/07/01 PHP
PHP empty函数报错解决办法
2014/03/06 PHP
php实现基于微信公众平台开发SDK(demo)扩展的方法
2014/12/22 PHP
php中分页及SqlHelper类用法实例
2017/01/12 PHP
PHP实现的数据对象映射模式详解
2019/03/20 PHP
jquery 插件学习(六)
2012/08/06 Javascript
javaScript NameSpace 简单说明介绍
2013/07/18 Javascript
JavaScript显示当然日期和时间即年月日星期和时间
2013/10/29 Javascript
JavaScript中的继承方式详解
2015/02/11 Javascript
微信浏览器内置JavaScript对象WeixinJSBridge使用实例
2015/05/25 Javascript
JavaScript中的getMilliseconds()方法使用详解
2015/06/10 Javascript
JS实现滑动菜单效果代码(包括Tab,选项卡,横向等效果)
2015/09/24 Javascript
基于Jquery插件实现跨域异步上传文件功能
2016/04/26 Javascript
nodejs连接mongodb数据库实现增删改查
2016/12/01 NodeJs
Vue+Jwt+SpringBoot+Ldap完成登录认证的示例代码
2018/05/21 Javascript
vue异步加载高德地图的实现
2018/06/19 Javascript
Angular-UI Bootstrap组件实现警报功能
2018/07/16 Javascript
Vue实现浏览器打印功能的代码
2020/04/17 Javascript
[04:26]2014DOTA2西雅图国际邀请赛 总决赛TOPPLAY
2014/07/22 DOTA
Python的Django框架中的URL配置与松耦合
2015/07/15 Python
Python实现身份证号码解析
2015/09/01 Python
python使用mysql的两种使用方式
2018/03/07 Python
python自制包并用pip免提交到pypi仅安装到本机【推荐】
2019/06/03 Python
python Gunicorn服务器使用方法详解
2019/07/22 Python
python生成特定分布数的实例
2019/12/05 Python
opencv3/C++实现视频背景去除建模(BSM)
2019/12/11 Python
Python 如何实现数据库表结构同步
2020/09/29 Python
5分钟实现Canvas鼠标跟随动画背景
2019/11/18 HTML / CSS
法国一家多品牌成衣精品中/高档商店:Graduate Store
2019/08/28 全球购物
好的演讲稿开场白
2013/12/30 职场文书
国贸专业个人求职信范文
2014/01/08 职场文书
运动会开幕式解说词
2014/02/05 职场文书
党的群众路线教育实践活动查摆问题及整改措施
2014/10/10 职场文书
毕业生登记表班级意见
2015/06/05 职场文书