Skip to main content

概述

在 Laravel 13 中,可以通过 PHP 属性来声明控制器的中间件分配和授权检查。无需再使用传统的 middleware() 方法或 can 中间件,只需直接在类或方法上添加属性即可完成配置。
所有控制器属性都位于 Illuminate\Routing\Attributes\Controllers 命名空间下。

#[Middleware] — 分配中间件

应用于类

在类级别添加 #[Middleware] 后,该中间件将应用于该控制器的所有操作。
如需添加多个中间件,可重复使用该属性。

应用于方法

在方法级别添加的中间件会与类级别的中间件合并。

使用 only / except 进行筛选

在类级别的属性上指定 onlyexcept 可以对目标方法进行筛选。

闭包中间件

属性也支持传入闭包,方便内联编写处理逻辑。

与传统 middleware() 方法的对比

使用属性时无需实现 HasMiddleware 接口。但如果将 middleware() 方法与属性混合使用,可能会产生非预期的行为,因此建议只使用其中一种方式。

#[WithoutMiddleware] — 排除中间件

从特定方法或整个类中排除在类级别应用的中间件。

应用于方法

应用于类与 only / except

在类级别添加 #[WithoutMiddleware] 后,中间件会从包含子类在内的所有操作中被排除。可以通过 only / except 限定排除范围。
#[WithoutMiddleware] 仅对路由中间件有效。无法排除注册在 app/Http/Kernel.php 中的全局中间件。

#[Authorize] — 基于策略的授权

作为 can 中间件的语法糖,可以通过属性以声明式方式进行基于策略的授权检查。

基本用法

策略的参数

第二个参数可以传入以下值:

can 中间件的对比

无需在路由文件中编写中间件,授权逻辑将集中在控制器中。

实践示例

应用于资源控制器

应用于 API 控制器

属性的处理顺序

当添加了多个属性时,处理顺序如下:
#[Authorize] 在内部作为 can 中间件运行,因此与 #[Middleware] 在同一管道中被处理。

总结:应该使用哪种方式

后续步骤

PHP 属性(队列 / Eloquent)

介绍可用于队列任务和 Eloquent 模型的 PHP 属性。

进阶:控制器

学习 Laravel 控制器的基础用法。
最后修改于 2026年8月2日