@aassdds
Люблю борщ и PHP

Как добавить Rule в validator так, чтобы правило сработало после основной проверки?

Добрый день. Дано:
Форма создания броней для посещения массажа
В форме 3 поля - время_от, время_до, массажный_кабинет
В контроллере есть следующий код:
public function validation()
{
    $request_data = request()->only(['meet_room_id', 'time_from', 'time_to', 'date']);

    $validation1 = Validator::make($request_data, [
        'time_from'=>['required','date_format:H:i'],
        'time_to'=>'required|date_format:H:i|after:time_from',
        'meet_room_id'=>["required","exists:meet_rooms,id", new BookingCalendarRule($request_data)]
    ]);
}


Вопрос: как делать, чтобы сначала прошла "простая валидация" типа required, date_format, и т.д., а потом уже запустилось правило BookingCalendarRule?
Основная загвоздка в том, что в BookingCalendarRule используется параметр time_from этого же реквеста, и если изначально формат времени не верный, то и в Rule передастся невалидный параметр.
Я понимаю что я сам туда передаю $requested_data, которая не проверена, но передать туда validated() данные я не могу, так как на тот момент их не существует.
Ближайший выход из ситуации который я нашел, это сделать 2 блока проверки — сначала на "простые правила", а потом уже более сложные.
Правильно ли это? Можно ли сделать как то более элегантно?
Я знаю, что есть возможность сделать кастомные реквесты и перенести туда валидацию - по факту так оно и есть, просто чтобы не писать тут кучу кода "для примера". Вопрос именно про сами блоки с валидацией.
Спасибо!
  • Вопрос задан
  • 98 просмотров
Решения вопроса 1
Alex_Wells
@Alex_Wells
PHP/TS/Kotlin developer
Есть правило, называется bail. Добавляете к каждому полю и валидатор будет сыпатся как только хотя бы одна проверка не пройдена, а значит к вашему кастомному правилу очередь не дойдет.

Плюс к тому в кастомное правило не нужно передавать никаких реквестов - в метод passes() правила передается все что нужно:
passes($attribute, $value, $parameters, $validator)


Передаете в конструктор правила только название какого-то дополнительного поля - типа time_from.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@XNicON
Валидатор проверяет поля, а не целый конструкции.
В документации всё прекрасно описано, для вашего случая есть after hook
https://laravel.com/docs/5.8/validation#after-vali...
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы