laravel - создать валидацию с помощью required_without и required_if - PullRequest
0 голосов
/ 08 октября 2019

Как создать проверку для формы, которая выглядит примерно так: если пользователь выбирает опцию «старый автомобиль», ему нужно выбрать имя автомобиля из списка выбора, а затем ему не нужно заполнять остальные поля. Если пользователь выбирает опцию «новый автомобиль», он должен ввести название автомобиля и номер. Если у автомобиля нет номера, пользователю необходимо установить флажок «автомобиль без номера», после чего ему нужно будет только ввести имя автомобиля. Сейчас это не так, как хотелось бы.

<form action="/action.php">
  <label for="exampleFormControlFile1">Cars:</label><br>
  <div id="option" role="radiogroup">          
  <input id="opt" type="radio" class="form-control form-control-sm" value="old" name="car" checked>Old car                  
 <input id="opt" type="radio" class="form-control form-control-sm" value="new" name="car">New car                  
 </div>
<div id="old_car">
{!! Form::select('car', $cars, null, ['class'=>'form-control form-control-sm form-control-chosen', 'placeholder' => 'Choose']) !!}
{!! $errors->first('bu', '<strong><p style="color:red;" class="help-block">:message</p></strong>') !!}
</div>
<div id="new_car">
<label for="exampleFormControlFile1">Car:</label><br>
<input class="form-control form-control-sm" name="name" type="text"><br>
<label for="exampleFormControlFile1">Car number:</label><br>
<input class="form-control form-control-sm" type="text" name="car_number" id="number"><br> 
{!! Form::checkbox('no_number', null, false,  ['class'=>'form-check-input', 'id'=>'car']); !!}
<label class="form-check-label" for="defaultCheck1">car without number</label>                
</div>              
<input type="submit" value="Submit">
</form>
class CarController

...

public function store(Request $request)
{
      $request->validate([            
            'car' => ['required_if:car,old', 'integer'],
            'name' => ['required_if:car,new', 'string'],
            'car_number' => ['required_if:car,new', 'required_without:no_number', 'unique:cars,c_number', 'digits_between:10,10'],

}

Редактировать Я забыл. Прямо сейчас, когда я выбираю новый автомобиль и отправляю полную форму, он показывает ошибку в раскрывающемся списке старых автомобилей, это значение должно быть целым числом.

1 Ответ

0 голосов
/ 08 октября 2019

Порядок в правилах проверки важен, согласно документации :

Остановка при первом сбое проверки

ИногдаВозможно, вы захотите прекратить запуск правил проверки для атрибута после первого сбоя проверки. Для этого назначьте правило залога атрибуту:

$request->validate([
    'title' => 'bail|required|unique:posts|max:255',
    'body' => 'required', ]);

В этом примере, если правило unique для атрибута title не выполнено, правило max проверяться не будет. Правила будут проверяться в том порядке, в котором они назначены.

И в вашем случае первое правило терпит неудачу 'required_if:car,new', Вы выбрали радиокнопку нового автомобиля, но не указали значение для car_number.

Итак, чтобы исправить проблему, вам нужно просто изменить порядок правил следующим образом:

public function store(Request $request)
{
      $request->validate([            
            'car' => ['required_if:car,old', 'integer'],
            'name' => ['required_if:car,new', 'string'],
            'car_number' => ['required_without:no_number', 'required_if:car,new', 
                             'unique:cars,c_number', 'digits_between:10,10'],
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...