参考其他请求参数的Laravel自定义验证规则

参考其他请求参数的Laravel自定义验证规则,laravel,validation,php-7,rules,laravel-validation,Laravel,Validation,Php 7,Rules,Laravel Validation,我正在尝试创建一个接受参数的自定义验证规则,但该参数是请求中另一个字段的名称,如required\u with规则 我可以轻松地处理规则中给定的参数,但我很难找到如何检索其他字段值 目前,我正在创建规则类作为 class MyClassRule { public function validate($attribute, $value, $parameters, $validator) : bool { // do some stuff here to retur

我正在尝试创建一个接受参数的自定义验证规则,但该参数是请求中另一个字段的名称,如
required\u with
规则

我可以轻松地处理规则中给定的参数,但我很难找到如何检索其他字段值

目前,我正在创建规则类作为

class MyClassRule
{
    public function validate($attribute, $value, $parameters, $validator) : bool
    {
        // do some stuff here to return true/false
    }
}
并在我的服务提供商中向

Validator::extend('my_rule', 'path\to\MyClassRule@validate');
所以我可以在我的请求中使用它作为

public function rules()
{
    return [
        'field' => ['my_rule'],
    ];
}
我想做的是

public function rules()
{
    return [
        'other_field' => [...],
        'field'       => ['my_rule:other_rule'],
    ];
}
并在我的规则类中使用
other\u字段
值,但是
validate()
$parameters
值只是
['other\u字段]
。i、 e.包含其他字段名而不是其值的数组


如何执行此操作?

因为
$validator
是正在使用的
验证程序
对象的完整实例,我们可以使用
getData()
从中检索数据:

公共函数验证($attribute、$value、$parameters、$validator)
{
//您可能需要先检查以确保它存在。
$otherField=$parameters[0];
$otherValue=data\u get($validator->getData(),$otherField);
//@todo验证$otherValue
}
使用
data\u get()
还允许对嵌套数组值使用点表示法。

Artisan命令

php artisan make:rule ValidateOtherField
类ValidateOtherField

class ValidateOtherField implements Rule
{
        private $error = '';
        public function passes($attribute, $value)
        {
            if(request()->has('field') && request()->get('field') === 'MyValueSuccess'){
                if(is_string($value)){
                    return true;
                } else {
                    $this->error = '- not valid field';
                }
            }
            return false;
        }
        public function message()
        {
            return "Error :attribute {$this->error}";
        }
 }
规则


我在Laravel 7.x上运行这个

在我的例子中,我试图制定一个规则来比较表单中的两个字段是否相等

让我们按照Laravel文档中的说明创建一个新的规则对象。


下面是生成规则类模板的控制台命令。
php工匠制作:规则StrEqualTo

下面是生成的自定义规则类以及逻辑的完整实现

<?php

namespace App\Rules;

use Illuminate\Contracts\Validation\Rule;

class StrEqualTo implements Rule{
    private $referredField = null;

    public function __construct(string $referredField){
        $this->referredField = $referredField;
    }

    public function passes($attribute, $value){
        return request()->input($this->referredField) === $value;
    }

    public function message(){
        return 'The :attribute must match with' . $this->referredField . '.';
    }
}
正如Laravel的文档中所述,如果验证成功,此函数必须返回true,否则必须返回false。我们在这里要做的是使用Laravel提供的
request()
helper函数,并从表单
input($this->referedField)
获取我们引用的字段的值

我们可以在下面的函数中编辑验证失败时它将创建的错误消息

public function message(){
        return 'The :attribute must match with' . $this->referredField . '.';
}
然后,我们将自定义规则类实例化为一个要用作验证规则的对象,如下面的代码所示。
'confirm-new-pass'=>['required','string','max:100',new-StrEqualTo('new-pass')]


希望这有帮助

好的,所以我必须实现
规则
接口,但是我不能在
passes()
方法中看到
$parameters
参数,就像在我的
validate()
方法中一样:这样我就不能将我的
其他_字段
名称作为参数传递给验证规则。此外,使用
passs()
方法,我是否仍然能够像以前一样在服务提供商中注册我的自定义规则?在Laravel 6.x中
request()->get('field')
中,规则类似乎不再起作用。或者至少在PhpUnit下访问
request()->attributes
ParameterBag only hold and empty数组。好的,这看起来很完美,我对
$validator
param一无所知,我发现的示例/教程都没有使用过它。
private $referredField = null;

public function __construct(string $referredField){
        $this->referredField = $referredField;
}
public function passes($attribute, $value){
        return request()->input($this->referredField) === $value;
}
public function message(){
        return 'The :attribute must match with' . $this->referredField . '.';
}