laravel 11 在验证机制上与 laravel 10 高度兼容,无破坏性变更,仅通过严格类型提示、rule 类原生类型声明、消息键名模糊匹配及 $fail() 参数自动解析等渐进式优化提升开发体验与类型安全。

Laravel 10 和 11 在验证机制上保持高度兼容,核心逻辑(如 Form Request、Rule 对象、Validator 门面)基本一致,没有破坏性变更。Laravel 11 并未重构验证系统,而是延续并优化了 Laravel 10 的成熟设计,重点在开发体验、类型安全和可维护性上做了渐进式增强。实际写法几乎无需修改,但有几个关键细节值得你注意和主动升级。
表单请求类的默认类型提示更严格
Laravel 11 默认启用 PHP 8.2+ 的严格类型特性,在新生成的 Form Request 类中,rules() 方法签名已明确声明返回类型:public function rules(): array。Laravel 10 允许省略或使用 array|string[] 等宽松写法,而 Laravel 11 推荐统一用 array。
- 旧写法(Laravel 10 兼容,但 Laravel 11 IDE 提示不推荐):
public function rules() { return [...]; } - 新写法(Laravel 11 推荐):
public function rules(): array { return [...]; } - 好处:配合 PHPStan/IDE 可提前发现规则数组结构错误,比如漏写字段键名或错用布尔值
自定义 Rule 类支持原生构造参数类型声明
Laravel 11 中,通过 php artisan make:rule Uppercase 生成的 Rule 类,其 构造方法 和 passes() 方法已自动添加 PHP 8.2+ 参数类型与返回类型声明:
-
passes(string $attribute, mixed $value): bool—— 明确约束输入类型,避免传入 null 或对象引发静默失败 - 若需带参数(如最小长度),构造函数可直接声明:
public function __construct(public int $min),Laravel 11 完全支持属性提升语法 - Laravel 10 同样支持,但脚手架不会自动生成类型;Laravel 11 模板已内置,开箱即用
messages() 与 attributes() 方法支持更自然的键名写法
两者都支持字段+规则的点号格式(如 'email.required'),但 Laravel 11 对 数组键名解析更宽容:
- Laravel 10 要求严格匹配规则名称(如
'email.unique:users'必须完整写出) - Laravel 11 支持模糊匹配,
'email.unique'即可覆盖所有unique规则(含unique:users,email,id,except等变体) - attributes() 返回的别名会自动参与消息渲染,且 Laravel 11 在 Blade 中使用
$errors->first('email')时,优先显示attributes()定义的名称,而非原始字段名
闭包验证回调的 $fail 参数更安全
在手动使用 Validator 或闭包规则时,Laravel 11 对 $fail() 回调的参数处理更健壮:
- 支持传入翻译键(如
$fail('validation.email_invalid')),框架自动调用__()解析,无需手动trans() - 若传入字符串含占位符(如
$fail('The :attribute must be at least :min characters.')),Laravel 11 会自动注入:attribute和:min值(基于当前字段与规则上下文) - Laravel 10 需要显式拼接或依赖语言文件,容易遗漏替换逻辑
本质上,Laravel 11 不是“重写验证”,而是把 Laravel 10 社区实践中沉淀出的最佳实践,固化为脚手架默认行为和运行时保障。你不需要重写旧代码,但新建项目或重构时,建议直接采用 Laravel 11 的模板风格——类型更清、提示更准、扩展更稳。











