如何在Laravel中创建自定义的Validation Rule? (验证规则对象)
发布时间 - 2026-01-10 00:00:00 点击率:次推荐使用 php artisan make:rule 命令创建验证规则类,生成于 app/Rules 目录,需实例化后在验证规则数组中使用(如 new UppercaseFirstLetter),不可直接写类名字符串;passes()返回布尔值,message() 支持 :attribute 占位符;跨字段校验应通过构造函数传参并谨慎访问 $this->validator?->getData(),优先考虑在 Form Request 的 withValidator() 中处理。
可以直接用 php artisan make:rule 命令生成验证规则类,这是 Laravel 官方推荐且最干净的做法,比闭包或匿名函数更易复用、测试和维护。
用 Artisan 命令创建 Rule 类
Laravel 5.5+ 内置了 make:rule 命令,会自动生成符合约定的类文件到 app/Rules 目录(Laravel 9+ 默认在 app/Rules;旧版本可能需手动创建该目录)。
执行命令:
php artisan make:rule UppercaseFirstLetter
生成的类默认包含 passes() 和 message() 两个方法,你只需填充逻辑即可。注意:passes() 必须返回布尔值,false 表示验证失败。
-
passes($attribute, $value):第一个参数是字段名(如name),第二个是实际提交的值 -
message()返回字符串,支持占位符如:attribute,会被自动替换为字段中文名(需在resources/lang/xx/validation.php中配置) - 若需访问整个请求数据,可在构造函数中接收
Request或使用$this->validator(需在validateWithBag等上下文中才可用,不推荐强依赖)
在 Form Request 或 validate() 中使用 Rule 实例
Rule 类不是自动注册的,必须实例化后传入验证规则数组。不能直接写类名字符串,也不能漏掉 new。
错误写法:
['name' => 'required|UppercaseFirstLetter'] // ❌ 不识别自定义类名
正确写法(在控制器中):
use App\Rules\UppercaseFirstLetter;
$request->validate([
'name' => ['required', new UppercaseFirstLetter],
]);
在 FormRequest 的 rules() 方法中同理:
public function rules()
{
return [
'title' => ['required', new UppercaseFirstLetter],
];
}
- 多个 Rule 可以链式组合,顺序即执行顺序
- 如果 Rule 需要参数(比如最小长度),在
__construct()中定义,并在new UppercaseFirstLetter($min)中传入 - 不要在
message()中硬编码字段名,始终用:attribute
Rule 类中访问其他字段值(如确认密码、日期范围)
单纯靠 $attribute 和 $value 无法获取其他字段。此时需借助 $this->validator —— 但这个属性只在 Rule 被 Validator 实例调用时才被注入,且文档未公开保证其稳定性。
更可靠的方式是:在 Rule 构造时传入依赖字段名,再通过 $this->validator?->getData() 获取全部输入(需判空):
class DateAfter implements Rule
{
protected $dateField;
public function __construct(string $dateField)
{
$this->dateField = $dateField;
}
public function passes($attribute, $value): bool
{
$data = $this->validator?->getData() ?? [];
$otherDate = $data[$this->dateField] ?? null;
return $value > $otherDate;
}
public function message(): string
{
return ':attribute must be after :date_field.';
}
}
- 使用时:
new DateAfter('start_date') -
$this->validator是可选的,上线前务必加?->或判空,否则在单元测试或非标准调用下可能报Call to a member function getData() on null - 这种跨字段校验更适合放在 Form Request 的
withValidator()中做,Rule 类尽量保持单字段职责
Rule 类看似简单,但容易忽略 $this->validator 的生命周期和空值风险;多人协作时,建议在构造函数里明确声明依赖,而不是隐式从 validator 抽数据。
# php
# laravel
# 编码
# app
# red
# NULL
# 构造函数
# 字符串
# Attribute
# 闭包
# function
# 对象
# this
# 字段名
# 链式
# 这是
# 放在
# 第一个
# 多个
# 布尔值
# 只需
# 推荐使用
# 并在
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel怎么判断请求类型_Laravel Request isMethod用法
百度输入法ai面板怎么关 百度输入法ai面板隐藏技巧
Laravel如何实现全文搜索功能?(Scout和Algolia示例)
WEB开发之注册页面验证码倒计时代码的实现
网站建设保证美观性,需要考虑的几点问题!
如何用低价快速搭建高质量网站?
如何在不使用负向后查找的情况下匹配特定条件前的换行符
国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?
Laravel如何实现用户注册和登录?(Auth脚手架指南)
Laravel如何实现API版本控制_Laravel API版本化路由设计策略
bing浏览器学术搜索入口_bing学术文献检索地址
Laravel怎么在Controller之外的地方验证数据
使用C语言编写圣诞表白程序
JavaScript如何操作视频_媒体API怎么控制播放
详解jQuery中基本的动画方法
Linux网络带宽限制_tc配置实践解析【教程】
laravel怎么配置和使用PHP-FPM来优化性能_laravel PHP-FPM配置与性能优化方法
Swift中switch语句区间和元组模式匹配
C++时间戳转换成日期时间的步骤和示例代码
长沙做网站要多少钱,长沙国安网络怎么样?
Laravel如何集成第三方登录_Laravel Socialite实现微信QQ微博登录
头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?
Laravel怎么清理缓存_Laravel optimize clear命令详解
php 三元运算符实例详细介绍
佛山企业网站制作公司有哪些,沟通100网上服务官网?
简历没回改:利用AI润色让你的文字更专业
Laravel的Blade指令怎么自定义_创建你自己的Laravel Blade Directives
香港服务器网站卡顿?如何解决网络延迟与负载问题?
如何基于云服务器快速搭建个人网站?
如何用AWS免费套餐快速搭建高效网站?
nodejs redis 发布订阅机制封装实现方法及实例代码
如何在阿里云域名上完成建站全流程?
Laravel怎么实现API接口鉴权_Laravel Sanctum令牌生成与请求验证【教程】
如何在IIS中新建站点并配置端口与物理路径?
C++用Dijkstra(迪杰斯特拉)算法求最短路径
无锡营销型网站制作公司,无锡网选车牌流程?
如何用花生壳三步快速搭建专属网站?
如何用PHP工具快速搭建高效网站?
Laravel如何记录日志_Laravel Logging系统配置与自定义日志通道
宙斯浏览器视频悬浮窗怎么开启 边看视频边操作其他应用教程
公司网站制作价格怎么算,公司办个官网需要多少钱?
海南网站制作公司有哪些,海口网是哪家的?
简历在线制作网站免费版,如何创建个人简历?
如何挑选优质建站一级代理提升网站排名?
香港网站服务器数量如何影响SEO优化效果?
Laravel Asset编译怎么配置_Laravel Vite前端构建工具使用
高防服务器租用如何选择配置与防御等级?
关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)
5种Android数据存储方式汇总
html5audio标签播放结束怎么触发事件_onended回调方法【教程】


返回布尔值,message() 支持 :attribute 占位符;跨字段校验应通过构造函数传参并谨慎访问 $this->validator?->getData(),优先考虑在 Form Request 的 withValidator() 中处理。