У меня есть следующие правила валидации для Laravel:Проверяющие поля условно с использованием Laravel
return [
'offer_type' => 'required|in:permanent,temporary',
'start_date' => 'required_if:offer_type,temporary|date_format:d/m/Y',
'end_date' => 'required_if:offer_type,temporary|date_format:d/m/Y|after:start_date',
];
В принципе, если offer_type
является temporary
, start_date
и end_date
требуется и должны соответствовать формату d/m/Y
. Кроме того, end_date
должен быть после start_date
.
offerType
Если это permanent
, нет необходимости проверять start_date
или end_date
, поскольку они еще не использовали.
Проблема у меня есть, что если пользователь отправляет данные, как в следующем:
offerType
: постоянныйstartDate
: обувendDate
: бар
Тогда Laravel воли повысить погрешность проверки, хотя start_date
и end_date
не нужно проверять, так как предложение type - permanent
.
Как я могу сделать Laravel только проверить start_date
и end_date
если offer_type
является temporary
.
My (плохо) Решение
Единственный способ, которым я нашел вокруг этого вопроса было сделать следующее:
Изменить вышеуказанные правила проверки к следующему:
return [
'offer_type' => 'required|in:permanent,temporary',
'start_date' => 'required_if:offer_type,temporary',
'end_date' => 'required_if:offer_type,temporary',
];
и Добавить в систему проверки подлинности:
$validator->after(function (Validator $validator) {
$data = $validator->getData();
$failed = $validator->failed();
if (array_key_exists('offerType', $data) &&
$data['offerType'] === 'temporary' &&
array_key_exists('start_date', $data) &&
array_key_exists('end_date', $data) &&
!array_key_exists('start_date', $failed) &&
!array_key_exists('end_date', $failed)
) {
$startDateString = $data['start_date'];
$endDateString = $data['end_date'];
$startDate = Carbon::createFromFormat('d/m/Y', $startDateString);
$endDate = Carbon::createFromFormat('d/m/Y', $endDateString);
if ($startDate === false) {
$validator->errors()->add('start_date', 'Start date must be in the format "dd/mm/yyyy"');
}
if ($endDate === false) {
$validator->errors()->add('end_date', 'End date must be in the format "dd/mm/yyyy"');
}
if ($startDate !== false && $endDate !== false && $endDate->lt($startDate)) {
$validator->errors()->add('end_date', 'End date must be after or equal to the start date');
}
}
});