Validation\Rule 自定义校验的使用与运行过程是怎么样的?
Validation\Rule 自定义校验的使用与运行过程是怎么样的
我的自定义校验代码如下:
<?php
namespace App\Rules;
use Illuminate\Contracts\Validation\Rule;
class RequiredAll implements Rule
{
public function __construct()
{
}
public function passes($attribute, $value)
{
var_dump("aaaa");
return false;
}
public function message()
{
return 'The validation error message.';
}
}
在控制器中的调用
'share_article_type' => [ new RequiredAll]
这样子不是应该会校验错误,并且打印 aaaa。
但是确定__construct 是有走进去的,但是passes这层没有,请问正确的写法是什么。
框架为laravel 5.6
后期更进
进去源码里找了很久发现有一个方法卡住了,让校验没有正确,导致没有走到调用自定义的passes()方法进行校验。我是用的请求校验方法是:
if ($validate->fails()) {
return $helperService->failResponse('参数传入错误' . $validate->errors()->first(), [], -2);
}
会调用框架的validateAttribute方法,但是这段代码中有一层校验
$validatable = $this->isValidatable($rule, $attribute, $value);
if ($rule instanceof RuleContract) {
return $validatable
? $this->validateUsingCustomRule($attribute, $value, $rule)
: null;
}
显然,这需要 $rule instanceof RuleContract 与 $validatable 两个条件都满足才会走到$this->validateUsingCustomRule这一层去做检验。
而 RuleContract 就是 Illuminate\Contracts\Validation\Rule
问题就出来$validatable 返回结果为false。点击去后发现,是$this->isNotNullIfMarkedAsNullable($rule, $attribute)验证为false;
最后锁定在这个方法内,我是将 $this->isImplicit($rule) 实现为true 从而保证 $this->isNotNullIfMarkedAsNullable($rule, $attribute)能够返回true。也就是将原本代码里 class RequiredAll implements Rule更改为 class RequiredAll implements ImplicitRule
问题暂时解决了,但是跟社区5.5版本的自定义校验实现还是不同的,希望大牛们能帮忙看一个正确的实现方式
推荐文章: