0

0

Laravel 中 Gates 与 Middleware 的核心区别详解

碧海醫心

碧海醫心

发布时间:2025-12-29 20:06:20

|

500人浏览过

|

来源于php中文网

原创

Laravel 中 Gates 与 Middleware 的核心区别详解

gates 用于授权(判断“用户能否执行某操作”),middleware 用于请求过滤(处理“请求是否应被放行”);二者职责分离、互不包含,不可替代。

在 Laravel 中,GateMiddleware 是两个独立且正交的概念,常被初学者混淆,尤其当两者都涉及用户状态(如登录检查)时。但它们在设计目标、执行时机、作用层级和使用场景上存在本质差异。

✅ 职责定位不同

  • Middleware 是 HTTP 请求生命周期的“守门人”,工作在请求进入应用后、到达控制器之前。它对整个 HTTP 请求进行预处理或拦截,例如:

    • auth 中间件检查用户是否已登录,未登录则重定向至登录页;
    • throttle 限制请求频率;
    • 自定义中间件可记录日志、修改请求头、校验 API token 等。
      它不关心业务逻辑,只关注请求本身是否合规。
  • Gate(及配套的 Policy)是授权系统的核心组件,工作在业务逻辑层,用于回答:“当前用户是否有权执行这个动作?” 例如:

    // 判断用户能否删除某篇文章
    if (Gate::allows('delete', $post)) {
        $post->delete();
    }

    或在控制器中:

    Figma
    Figma

    Figma 是一款基于云端的 UI 设计工具,可以在线进行产品原型、设计、评审、交付等工作。

    下载
    $this->authorize('update', $post);

    Gate 的判断基于用户身份、角色、权限规则等,但它本身不会终止请求或跳转页面——它只返回 true/false。重定向或异常响应需由开发者显式处理(如配合 authorize() 抛出 AuthorizationException,再由 Illuminate\Auth\Access\AuthorizationException 的全局异常处理器自动返回 403 或重定向)。

❌ 它们彼此不包含

⚠️ Middleware 不包含 Gate,Gate 也不依赖 Middleware。 你不能在中间件里“调用 Gate 实现认证”——因为认证(Authentication)是确认“你是谁”,而授权(Authorization)是确认“你能做什么”。Laravel 的 auth 中间件完成的是前者(读取 session/token,设置 Auth::user()),为后续 Gate 授权提供用户上下文;但 Gate 本身不执行认证,也不触发重定向。 反过来,Gate 的 allows() 或 authorize() 方法必须确保用户已认证(否则可能报错或返回 false),但这应由前置中间件(如 auth)保障,而非 Gate 自身职责。

? 典型协作模式(推荐实践)

// routes/web.php
Route::put('/posts/{post}', [PostController::class, 'update'])
    ->middleware(['auth'])           // ✅ 第一步:确保已登录
    ->can('update', 'post');         // ✅ 第二步:内置 can() 中间件调用 Gate 授权

此处 can('update', 'post') 是 Laravel 提供的授权中间件,它内部调用 Gate::allows(),但本质仍是中间件——它利用 Gate 做决策,再根据结果放行或抛出异常。这体现了“分工协作”,而非“包含关系”。

? 总结

维度 Middleware Gate / Policy
核心目的 请求过滤与预处理 业务级权限判定
执行时机 HTTP 请求生命周期早期(路由前) 控制器/模型/视图等业务逻辑中
是否跳转 可直接重定向、中止请求 仅返回布尔值,跳转需额外处理
依赖关系 不依赖 Gate 通常依赖已认证的用户(由 middleware 提供)
可复用性 按请求维度复用(如所有 API) 按资源/动作维度复用(如 delete-post)

因此,若你曾用 Gate 实现登录跳转,说明误用了 Gate —— 正确做法是:用 auth 中间件处理认证,用 Gate + authorize() 或策略方法处理授权,并让异常处理器统一响应。职责分明,代码才真正健壮、可维护。

相关专题

更多
laravel组件介绍
laravel组件介绍

laravel 提供了丰富的组件,包括身份验证、模板引擎、缓存、命令行工具、数据库交互、对象关系映射器、事件处理、文件操作、电子邮件发送、队列管理和数据验证。想了解更多laravel的相关内容,可以阅读本专题下面的文章。

313

2024.04.09

laravel中间件介绍
laravel中间件介绍

laravel 中间件分为五种类型:全局、路由、组、终止和自定。想了解更多laravel中间件的相关内容,可以阅读本专题下面的文章。

270

2024.04.09

laravel使用的设计模式有哪些
laravel使用的设计模式有哪些

laravel使用的设计模式有:1、单例模式;2、工厂方法模式;3、建造者模式;4、适配器模式;5、装饰器模式;6、策略模式;7、观察者模式。想了解更多laravel的相关内容,可以阅读本专题下面的文章。

363

2024.04.09

thinkphp和laravel哪个简单
thinkphp和laravel哪个简单

对于初学者来说,laravel 的入门门槛较低,更易上手,原因包括:1. 更简单的安装和配置;2. 丰富的文档和社区支持;3. 简洁易懂的语法和 api;4. 平缓的学习曲线。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

363

2024.04.10

laravel入门教程
laravel入门教程

本专题整合了laravel入门教程,想了解更多详细内容,请阅读专题下面的文章。

80

2025.08.05

laravel实战教程
laravel实战教程

本专题整合了laravel实战教程,阅读专题下面的文章了解更多详细内容。

63

2025.08.05

laravel面试题
laravel面试题

本专题整合了laravel面试题相关内容,阅读专题下面的文章了解更多详细内容。

62

2025.08.05

什么是中间件
什么是中间件

中间件是一种软件组件,充当不兼容组件之间的桥梁,提供额外服务,例如集成异构系统、提供常用服务、提高应用程序性能,以及简化应用程序开发。想了解更多中间件的相关内容,可以阅读本专题下面的文章。

175

2024.05.11

俄罗斯搜索引擎Yandex最新官方入口网址
俄罗斯搜索引擎Yandex最新官方入口网址

Yandex官方入口网址是https://yandex.com;用户可通过网页端直连或移动端浏览器直接访问,无需登录即可使用搜索、图片、新闻、地图等全部基础功能,并支持多语种检索与静态资源精准筛选。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1

2025.12.29

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 8万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 6.9万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号