基于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 相关文章推荐
win7+apache+php+mysql环境配置操作详解
Jun 10 PHP
PHP 登录完成后如何跳转上一访问页面
Jan 14 PHP
PHP读取文件内容后清空文件示例代码
Mar 18 PHP
修复ShopNC使用QQ 互联时提示100010 错误
Nov 08 PHP
高质量PHP代码的50个实用技巧必备(上)
Jan 22 PHP
php解析xml 的四种简单方法(附实例)
Jul 11 PHP
浅谈php中的循环while、do...while、for、foreach四种循环
Nov 05 PHP
基于Laravel实现的用户动态模块开发
Sep 21 PHP
Laravel 关联模型-关联新增和关联更新的方法
Oct 10 PHP
phpinfo的知识点总结
Oct 10 PHP
php下的原生ajax请求用法实例分析
Feb 28 PHP
PHP安全之register_globals的on和off的区别
Jul 23 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基础知识:类与对象(5) static
2006/12/13 PHP
php定时删除文件夹下文件(清理缓存文件)
2013/01/23 PHP
解析PHP汉字转换拼音的类
2013/06/18 PHP
PHP+ajax分页实例简析
2015/12/07 PHP
PHP unlink与rmdir删除目录及目录下所有文件实例代码
2018/02/07 PHP
Laravel jwt 多表(多用户端)验证隔离的实现
2019/12/18 PHP
jQuery学习笔记[1] jQuery中的DOM操作
2010/12/03 Javascript
图片img的src不变让浏览器重新加载实现方法
2013/03/29 Javascript
jQuery实现列表自动循环滚动鼠标悬停时停止滚动
2013/09/06 Javascript
JavaScript中的全局对象介绍
2015/01/01 Javascript
分享9点个人认为比较重要的javascript 编程技巧
2015/04/27 Javascript
js兼容pc端浏览器并有多种弹出小提示的手机端浮层控件实例
2015/04/29 Javascript
ionic进入多级目录后隐藏底部导航栏(tabs)的完美解决方案
2016/11/23 Javascript
canvas绘制多边形
2017/02/24 Javascript
JS点击图片弹出文件选择框并覆盖原图功能的实现代码
2017/08/25 Javascript
详解设置Webstorm 利用babel将ES6自动转码成ES5
2017/12/20 Javascript
angularjs 获取默认选中的单选按钮的value方法
2018/02/28 Javascript
超好用的jQuery分页插件jpaginate用法示例【附源码下载】
2018/12/06 jQuery
详解阿里Node.js技术文档之process模块学习指南
2021/01/04 Javascript
聊聊vue 中的v-on参数问题
2021/01/29 Vue.js
python中__call__方法示例分析
2014/10/11 Python
利用Python的Django框架生成PDF文件的教程
2015/07/22 Python
python函数的5种参数详解
2017/02/24 Python
Python自动发邮件脚本
2017/03/31 Python
python 拷贝特定后缀名文件,并保留原始目录结构的实例
2018/04/27 Python
Pycharm取消py脚本中SQL识别的方法
2018/11/29 Python
对python 合并 累加两个dict的实例详解
2019/01/21 Python
基于python全局设置id 自动化测试元素定位过程解析
2019/09/04 Python
Pycharm 2020年最新激活码(亲测有效)
2020/09/18 Python
详解Python中import机制
2020/09/11 Python
详解java调用python的几种用法(看这篇就够了)
2020/12/10 Python
猫途鹰英国网站:TripAdvisor英国(旅游社区和旅游评论)
2016/08/30 全球购物
Linux文件系统类型
2012/02/15 面试题
话题作文之自信作文
2019/11/15 职场文书
Python连续赋值需要注意的一些问题
2021/06/03 Python
HTML中的表单元素介绍
2022/02/28 HTML / CSS