0

0

如何在Laravel中创建自定义的Validation Rule? (验证规则对象)

穿越時空

穿越時空

发布时间:2026-01-10 13:44:02

|

415人浏览过

|

来源于php中文网

原创

推荐使用 php artisan make:rule 命令创建验证规则类,生成于 app/Rules 目录,需实例化后在验证规则数组中使用(如 new UppercaseFirstLetter),不可直接写类名字符串;passes() 返回布尔值,message() 支持 :attribute 占位符;跨字段校验应通过构造函数传参并谨慎访问 $this->validator?->getData(),优先考虑在 Form Request 的 withValidator() 中处理。

如何在laravel中创建自定义的validation rule? (验证规则对象)

可以直接用 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

错误写法:

DreamStudio
DreamStudio

SD兄弟产品!AI 图像生成器

下载
['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文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

2351

2023.09.01

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

1532

2023.10.11

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

1425

2023.10.11

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

951

2023.10.23

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

1413

2023.10.23

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

1233

2023.11.03

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1445

2023.11.09

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1304

2023.11.13

c++主流开发框架汇总
c++主流开发框架汇总

本专题整合了c++开发框架推荐,阅读专题下面的文章了解更多详细内容。

25

2026.01.09

热门下载

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

精品课程

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

共137课时 | 8.5万人学习

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

共6课时 | 6.9万人学习

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

共13课时 | 0.8万人学习

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

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