参考其他请求参数的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 . '.';
}