Laravel验证:仅在存在字段的情况下验证

时间:2019-11-20 10:29:20

标签: validation laravel-5

因此,如果满足某些条件,我将隐藏所有字段。现在我的验证出现问题了。这是我所拥有的:

blade.php

<div class="{{ $room['show_checkin_out'] ? '' : 'hide-fields' }}">
    <div class="form-group check-in-dtls">
        <label for="before_checkin">@lang('before_checkin')</label>
        <input type="text" class="form-control" id="before_checkin" name="before_checkin" placeholder="@lang('before_checkin')" value="{{ old('before_checkin', '') }}">
        @if ($errors->has('before_checkin'))
            <div class="form-group">
                <p class="text-danger">{{ $errors->first('before_checkin') }}</p>
            </div>
        @endif
    </div>
</div>

验证文件

'before_checkin' => ['sometimes', 'required', 'max:255'],

css

.hide-fields{
    display: none;
}

我希望仅在显示了该字段并且我的验证无法正常工作时才需要这些字段。为此,最好的方法是什么?

3 个答案:

答案 0 :(得分:1)

我可以建议3种方法。

  1. 如果$room['show_checkin_out']虚假,则根本不添加此验证规则。

种类:

$rules = [...];
if ($room['show_checkin_out']) {
    $rules['before_checkin'] = ['sometimes', 'required', 'max:255'];
}
  1. 使用“必填项”规则(https://laravel.com/docs/5.8/validation#rule-required-with)。 只需在必要时将show_checkin_out作为隐藏参数传递,并仅在存在before_checkin时使show_checkin_out成为必需。

添加到您的表单中:

@if($room['show_checkin_out'])
    <input type="hidden" name="show_checkin_out" value="1"/>
@endif

以这种方式修改验证规则:

'before_checkin' => ['required_with:show_checkin_out', 'sometimes', 'max:255'],
  1. 可能是最好的。由于您已经具有sometimes规则,因此当before_checkin虚假时,基本上不会输出show_checkin_out字段:
@if($room['show_checkin_out'])
    <div class="form-group check-in-dtls">
        <label for="before_checkin">@lang('before_checkin')</label>
        <input type="text" class="form-control" id="before_checkin" name="before_checkin" placeholder="@lang('before_checkin')" value="{{ old('before_checkin', '') }}">
        @if ($errors->has('before_checkin'))
            <div class="form-group">
                <p class="text-danger">{{ $errors->first('before_checkin') }}</p>
            </div>
        @endif
    </div>
@endif

答案 1 :(得分:0)

您可以执行此操作,而不是设置display:none属性。

@if(isset($room['show_checkin_out']))
<div class="">
  <div class="form-group check-in-dtls">
    <label for="before_checkin">@lang('before_checkin')</label>
      <input type="text" class="form-control" id="before_checkin" name="before_checkin" placeholder="@lang('before_checkin')" value="{{ old('before_checkin', '') }}">
     @if ($errors->has('before_checkin'))
        <div class="form-group">
            <p class="text-danger">{{ $errors->first('before_checkin') }}</p>
         </div>
     @endif
   </div>
 </div>
@endif

如果设置为$room['show_checkin_out'],它将创建该部分并进行验证,否则将不会创建该部分,并且您的验证将按您希望的那样进行。

答案 2 :(得分:0)

所以最后,我完成了验证工作。

刀片

.... name="{{ $room['show_checkin_out']==1 ? 'before_checkin' : '' }}"

验证

$ret = [
       // other validation
       ];

if (\Request::has('before_checkin')) {
    $ret['before_checkin'] = ['required', 'sometimes', 'max:255'];
}

要简单得多。