0

У меня есть следующие правила валидации для 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'); 
     } 
    } 
}); 

ответ

0

Я предлагаю вам иметь отдельный класс FormRequest. Тогда ваш rules() будет выглядеть следующим образом:

public function rules() 
{ 
    $rules = [ 
     'offer_type' => 'required|in:permanent,temporary', 
     'start_date' => 'required_if:offer_type,temporary', 
     'end_date' => 'required_if:offer_type,temporary', 
    ]; 

    if ($this->offer_type == 'permament') { 
     $this->getInputSource()->remove('start_date'); // optionally you may remove start_date from request 
     $this->getInputSource()->remove('end_date'); // same of end_date 
     unset($rules['start_date']); 
     unset($rules['end_date']); 
    } 

    return $rules; 
} 

Laravel Docs на Form Request Validation

Смежные вопросы