Laravel8自定义Rule对象如何访问验证器其他字段或验证器实例
Laravel 8 自定义Rule类访问验证器其他字段/实例方案
你创建自定义规则的命令为:
php artisan make:rule RequireBetweenOf
生成的规则类默认实现了Rule接口,要访问验证器内的其他数据,可以通过Laravel内置的两个专属接口实现,不需要依赖不规范的request()助手,也不需要改用Validator::extend方式。
场景1:仅需要访问验证器的所有输入数据
- 让规则类实现
Illuminate\Contracts\Validation\DataAwareRule接口 - 新增
$allData属性存储所有验证数据,实现接口要求的setData方法 - 在
passes方法中直接用$this->allData获取任意字段的值
代码示例:
<?php namespace App\Rules; use Illuminate\Contracts\Validation\Rule; use Illuminate\Contracts\Validation\DataAwareRule; class RequireBetweenOf implements Rule, DataAwareRule { // 存储当前验证器正在处理的所有输入数据 protected $allData = []; // 实现DataAwareRule要求的setData方法 public function setData($data) { $this->allData = $data; return $this; } /** * 验证逻辑示例:判断当前值在min_field和max_field两个字段的取值之间 */ public function passes($attribute, $value) { $min = $this->allData['min_field'] ?? 0; $max = $this->allData['max_field'] ?? 100; return $value >= $min && $value <= $max; } public function message() { return '当前字段值必须在min_field和max_field的取值范围内'; } }
场景2:需要访问完整的验证器实例
如果需要调用验证器的方法、获取已有的错误信息、访问验证规则配置等,就实现Illuminate\Contracts\Validation\ValidatorAwareRule接口:
<?php namespace App\Rules; use Illuminate\Contracts\Validation\Rule; use Illuminate\Contracts\Validation\ValidatorAwareRule; use Illuminate\Validation\Validator; class RequireBetweenOf implements Rule, ValidatorAwareRule { // 存储当前验证器实例 protected $validator; // 实现ValidatorAwareRule要求的setValidator方法 public function setValidator(Validator $validator) { $this->validator = $validator; return $this; } public function passes($attribute, $value) { // 可以调用验证器的所有公开方法,比如先判断其他字段有没有通过验证 if ($this->validator->errors()->has('min_field')) { return false; } // 也可以通过验证器获取所有输入数据 $allData = $this->validator->getData(); $min = $allData['min_field'] ?? 0; $max = $allData['max_field'] ?? 100; return $value >= $min && $value <= $max; } public function message() { return '当前字段值必须在min_field和max_field的取值范围内'; } }
补充说明
- 两个接口可以同时实现,同时拿到所有输入数据和验证器实例
- 该方案拿到的始终是当前验证器正在处理的数据集,哪怕你是手动调用
Validator::make()传入自定义数组做验证,也能正确获取对应数据,不会和全局请求数据混淆,完全符合Laravel的设计规范。
内容的提问来源于stack exchange,提问作者PiTheNumber
相关产品推荐
相关产品推荐

