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我使用laravelcollective表单助手,如下所示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)
问题是,我的自定义验证规则没有被调用,因为该字段不是必需的并且它具有空值。我需要任何允许两种情况的方法:
drawings文件字段为空$product->drawings且不为空时,不进行验证drawings文件字段为空且$product->drawings为空时,验证发生。换句话说,我需要一个内置的验证规则,例如requiredIf但它不接受另一个表单字段作为参数,它只需要另一个值,即使表单字段值为空并且不需要该字段,它也始终有效。
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)