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版本的自定义校验实现还是不同的,希望大牛们能帮忙看一个正确的实现方式

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!