如何在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],
]);

FormRequestrules() 方法中同理:

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回调方法【教程】