You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 05:45:03