基于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生成EXCEL的东东
Oct 09 PHP
PHP array_multisort()函数的使用札记
Jul 03 PHP
细谈php中SQL注入攻击与XSS攻击
Jun 10 PHP
php开发文档 会员收费1期
Aug 14 PHP
获取URL文件名后缀
Oct 24 PHP
PHP中的reflection反射机制测试例子
Aug 05 PHP
PHP连接access数据库
Mar 27 PHP
CodeIgniter 完美解决URL含有中文字符串
May 13 PHP
Yii2创建控制器(createController)方法详解
Jul 23 PHP
php动态读取数据清除最右边距的方法
Apr 12 PHP
Yii2.0使用阿里云OSS的SDK上传图片、下载、删除图片示例
Sep 20 PHP
thinkphp中的多表关联查询的实例详解
Oct 12 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批量删除超链接的实现方法
2015/10/19 PHP
php微信公众号开发之现金红包
2018/04/16 PHP
PHP封装的非对称加密RSA算法示例
2018/05/28 PHP
javascript中的对象和数组的应用技巧
2007/01/07 Javascript
jquery预览图片实现鼠标放上去显示实际大小
2014/01/16 Javascript
JS中getYear()和getFullYear()区别分析
2014/07/04 Javascript
js防止页面被iframe调用的方法
2014/10/30 Javascript
Javascript非构造函数的继承
2015/04/27 Javascript
javascript中offset、client、scroll的属性总结
2015/08/13 Javascript
网页前端登录js按Enter回车键实现登陆的两种方法
2016/05/10 Javascript
如何用Node写页面爬虫的工具集
2018/10/26 Javascript
BootStrap table实现表格行拖拽效果
2018/12/01 Javascript
深入理解Node内建模块和对象
2019/03/12 Javascript
jQuery实现动态添加和删除input框实例代码
2019/03/26 jQuery
vue基于viewer实现的图片查看器功能
2019/04/12 Javascript
微信小程序返回上一级页面的实现代码
2020/06/19 Javascript
[01:33]PWL开团时刻DAY2-开雾与反开雾
2020/10/31 DOTA
pycharm 使用心得(六)进行简单的数据库管理
2014/06/06 Python
30分钟搭建Python的Flask框架并在上面编写第一个应用
2015/03/30 Python
Python中urllib+urllib2+cookielib模块编写爬虫实战
2016/01/20 Python
Python读取图片属性信息的实现方法
2016/09/11 Python
对python添加模块路径的三种方法总结
2018/10/16 Python
python实现自动获取IP并发送到邮箱
2018/12/26 Python
python 求1-100之间的奇数或者偶数之和的实例
2019/06/11 Python
python在OpenCV里实现投影变换效果
2019/08/30 Python
selenium 多窗口切换的实现(windows)
2020/01/18 Python
python中adb有什么功能
2020/06/07 Python
Python之Matplotlib文字与注释的使用方法
2020/06/18 Python
在pycharm中文件取消用 pytest模式打开的操作
2020/09/01 Python
后勤副校长自我鉴定
2013/10/13 职场文书
美发活动策划书
2014/01/14 职场文书
标准版离职证明书
2014/09/12 职场文书
师范生见习报告范文
2014/11/03 职场文书
2014年安全员工作总结
2014/11/13 职场文书
2014年行风建设工作总结
2014/12/01 职场文书
canvas 中如何实现物体的框选
2022/08/05 Javascript