Laravel 自定义验证规则适用于不需要的空字段

Sai*_*akR 0 php laravel laravel-5

我有必需的文件字段,它作为路径记录在数据库中。如果它在数据库中的字段为空,我想使它成为可选的必需项。在update我的控制器的操作中,我设置了以下验证:

$this->validate(request(),[
    'drawings' => 'requiredIfEmpty:'.$product->drawings.'|file|max:'. config('fox.photoMaxSize').'|mimes:pdf',
Run Code Online (Sandbox Code Playgroud)

然后在app/Providers/AppServiceProvider.php我定义的requiredIfEmpty验证器中:

Validator::extend('requiredIfEmpty',function ($attribute,$value,$parameters,$validator){
        if(is_null($parameters[0]) || empty($parameters[0])){
            if (is_null($value)){
                return false;
            }
        }
        return true;
    });

    Validator::replacer('requiredIfEmpty', function ($message, $attribute, $rule, $parameters) {
        return __('The :attr is required',['attr' => $attribute]);
    });
Run Code Online (Sandbox Code Playgroud)

在视图中,_form我使用表单助手,如下所示drawings

<div class="form-group {{$errors->first('drawings','has-error')}}">
    @if (!is_null($product->drawings))
    <a href="{{$product->drawings}}" target="_bfox"><img src="/imgs/pdf.png" alt="{{__('PDF File')}}" title="{{__('PDF File')}}" /></a>
    <br>
    @else
    <img src="/imgs/empty.png" width="64" height="64" alt="{{__('Empty')}}..." title="{{__('Empty')}}..." /> <br>
    @endif
    {!! Form::label('drawings', __('Drawings')) !!}        

        {!! Form::file('drawings',['class' => 'btn btn-info','title' =>__('PDF file')]); !!}
        @php ($eleE =  $errors->first('drawings'))
        @include('layouts.form-ele-error')

</div>
Run Code Online (Sandbox Code Playgroud)

问题是,我的自定义验证规则没有被调用,因为该字段不是必需的并且它具有空值。我需要任何允许两种情况的方法:

  1. drawings文件字段为空$product->drawings且不为空时,不进行验证
  2. drawings文件字段为空且$product->drawings为空时,验证发生。

换句话说,我需要一个内置的验证规则,例如requiredIf但它不接受另一个表单字段作为参数,它只需要另一个值,即使表单字段值为空并且不需要该字段,它也始终有效。

Wel*_*nço 5

extendImplicit当规则的值为空时,您应该使用该函数来运行规则。

Validator::extendImplicit('required_if_exists', function($attribute, $value, $parameters, $validator) {
    //
});
Run Code Online (Sandbox Code Playgroud)

或者,在 Rule 类中,您应该实现ImplicitRule接口而不是Rule.

use Illuminate\Contracts\Validation\ImplicitRule;

class RequiredIfExists implements ImplicitRule {
    //
}
Run Code Online (Sandbox Code Playgroud)