基于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教程孙仲岳主讲
Jan 07 PHP
解决了Ajax、MySQL 和 Zend Framework 的乱码问题
Mar 03 PHP
php中大括号作用介绍
Mar 22 PHP
PHP 杂谈《重构-改善既有代码的设计》之五 简化函数调用
May 07 PHP
教你如何解密 “ PHP 神盾解密工具 ”
Jun 20 PHP
thinkphp文件处理类Dir.class.php的用法分析
Dec 08 PHP
PHP按指定键值对二维数组进行排序的方法
Dec 22 PHP
smarty中改进truncate使其支持中文的方法
May 30 PHP
PHP链表操作简单示例
Oct 15 PHP
php实现等比例不失真缩放上传图片的方法
Nov 14 PHP
PHP会话控制实例分析
Dec 24 PHP
PHP设计模式概论【概念、分类、原则等】
May 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结合Jquery和ajax实现瀑布流特效
2016/01/07 PHP
php图形jpgraph操作实例分析
2017/02/22 PHP
解析 thinkphp 框架中的部分方法
2017/05/07 PHP
PHP实现的微信公众号扫码模拟登录功能示例
2019/05/30 PHP
不常用但很实用的PHP预定义变量分析
2019/06/25 PHP
Span元素的width属性无效果原因及解决方案
2010/01/15 Javascript
JavaScript strike方法入门实例(给字符串加上删除线)
2014/10/17 Javascript
JQuery中绑定事件(bind())和移除事件(unbind())
2015/02/27 Javascript
jQuery实现鼠标划过添加和删除class的方法
2015/06/26 Javascript
javascript添加前置0(补零)的几种方法
2017/01/05 Javascript
JavaScript实现256色转灰度图
2017/02/22 Javascript
JS与jQuery实现子窗口获取父窗口元素值的方法
2017/04/17 jQuery
微信小程序之网络请求简单封装实例详解
2017/06/28 Javascript
vue-cli中的babel配置文件.babelrc实例详解
2018/02/22 Javascript
vue中动态添加class类名的方法
2018/09/05 Javascript
vue.js高德地图实现热点图代码实例
2019/04/18 Javascript
JavaScript观察者模式原理与用法实例详解
2020/03/10 Javascript
微信小程序接入vant Weapp组件的详细步骤
2020/10/28 Javascript
详解python之简单主机批量管理工具
2017/01/27 Python
快速了解Python开发中的cookie及简单代码示例
2018/01/17 Python
PySide和PyQt加载ui文件的两种方法
2019/02/27 Python
pycharm解决关闭flask后依旧可以访问服务的问题
2020/04/03 Python
python 实现aes256加密
2020/11/27 Python
python matplotlib工具栏源码探析二之添加、删除内置工具项的案例
2021/02/25 Python
Html5 postMessage实现跨域消息传递
2016/03/11 HTML / CSS
html5手机端页面可以向右滑动导致样式受影响的问题
2018/06/20 HTML / CSS
《守株待兔》教学反思
2014/03/01 职场文书
爱国主义演讲稿
2014/05/07 职场文书
英语教师求职信
2014/06/16 职场文书
群众路线问题查摆对照检查材料
2014/10/04 职场文书
2014年物业公司工作总结
2014/11/22 职场文书
初婚初育证明范本
2015/06/18 职场文书
Python Django搭建文件下载服务器的实现
2021/05/10 Python
Pytest中skip skipif跳过用例详解
2021/06/30 Python
前端监听websocket消息并实时弹出(实例代码)
2021/11/27 Javascript
GTX1650super好不好 gtx1650super显卡属于什么级别
2022/04/08 数码科技