Laravel 4: проверить дату начала и окончания с до и после проверки

Я хочу проверить два поля даты в форме from_date и end_date. Необходимость проверки from_date меньше, чем end_date.

$rules = array('from_date' => array('sometimes','date_format:"Ymd"', 'before:'.Input::get('to_date') ), 'to_date' => array('sometimes','date_format:"Ymd"', 'after:'.Input::get('from_date') ) ); 

Это то, что я пробовал. Но это не работает. Если я дам to_date как пустое значение, это произойдет через ошибку.

Laravel 5:

Вот более обширный подход, который следует современным принципам и более похож на Laravel. Это немного сложнее, но все же легко следовать, и конечные результаты намного чище.

Начнем с изменения нескольких вещей. Давайте уменьшим это до конкретной проблемы, используйте новый синтаксис массива и применим форматирование.

 $rules = [ 'from_date' => [ 'before:'.Input::get('to_date') // This is what we will learn to do ], 'to_date' => [ 'after:'.Input::get('from_date') // Do this one on your own ] ]; 

Теперь давайте создадим новый запрос с php artisan make:request StoreWhateverRequest . Это создаст файл App/HTTP/Request/StoreWhateverRequest.php . Откройте это и поместите свои правила в возвращаемом массиве функции rules() .

 return [ 'from_date' => 'date', 'to_date' => 'date|after_field:from_date' ]; 

Это пока не работает, потому что after_field пока недоступно. Давайте создадим это. Нам нужен новый класс, который расширяет валидатор. Вы можете разместить его в app/Services . Нам нужно что-то похожее:

 <?php namespace App\Services; use Illuminate\Validation\Validator; use Carbon\Carbon; class AfterFieldValidator extends Validator { public function validateAfterField($attribute, $value, $parameters) { return Carbon::parse($value) > Carbon::parse($this->data[$parameters[0]]); } } 

В приведенном выше примере мы имеем: $attribute который является именем поля, которое мы проверяем (to_date), $value – это значение поля, которое мы проверяем, а $parameters – это параметры, которые мы передали в Validator (from_date) 'to_date' => 'date|afterField:from_date' . Нам также нужны другие поля данных, переданные в Validator, мы можем получить их с помощью данных $this->data . Тогда нам просто нужно предварительно сформировать логику. Вам действительно не нужен Carbon здесь, но обязательно проанализируйте строку, чтобы мы не проводили сравнение строк.

Теперь нам нужно загрузить это приложение. Для этого app/Providers/AppServiceProviders.php ниже код внутри функции boot() в app/Providers/AppServiceProviders.php .

 Validator::resolver(function($translator, $data, $rules, $messages) { return new afterFieldValidator($translator, $data, $rules, $messages); }); 

Последний шаг проще всего. Просто введите экземпляр StoreWhateverRequest в наш контроллер.

 ... public function store(StoreWhateverRequest $request) { ... 

Все сделано. Я чувствую, что это довольно солидный способ решить проблему.

Пожалуйста, используйте приведенный ниже код в laravel 5.2 и он отлично работает для проверки даты начала и окончания.

 $this->validate($request, [ 'start_date' => 'required|before:end_date', 'end_date' => 'required', ]); 

Во всяком случае,

Я сделал это так. Таким образом, даже если какая-либо дата в форме пуста, которая будет автоматически заполняться и проверять правильность

 $inputs = Input::all(); if(!empty($inputs)) { $default_date_arr = array('from_date' => date('Ym-d', strtotime('-1 days')), 'to_date' => date('Ym-d')); $inputs = $inputs+$default_date_arr; } $rules = array('from_date' => array('sometimes','date_format:"Ymd"', 'before:'.$to_date) , 'to_date' => array('sometimes','date_format:"Ymd"', 'after:'.$from_date ) ); $validator = Validator::make($inputs,$rules); if($validator->fails()) { ... } 

Это не может быть ответом на то, что я спросил. Но мне нужен был просто способ закончить это. Может быть полезно для других.

Просто наткнулся на это и подумал, что я поделился бы ответом, который нашел: Сравнить атрибуты в валидации

В принципе, вы бы создали новый Validator, который расширяет Illuminate \ Validation \ Validator и записывает там настраиваемое правило:

 public function validateEndAfter($attribute, $value, $parameters) { $start_date = $this->getValue($parameters[0]); // get the value of the parameter (start_date) return (strtotime($value) > strtotime($start_date)); } 

то в вашем валидаторе используйте новое правило:

 $rules = [ 'start_date' => 'required', 'end_date'=> 'required|end_after:start_date', ] 

Я знаю, что речь идет о Laravel 4 НО, если вы используете Laravel 5.3, теперь вы можете использовать что-то вроде:

 $rules = array( 'date_start' => 'required|date_format:Ymd|before_or_equal:date_end', 'date_end' => 'required|date_format:Ymd|after_or_equal:date_start' ); $validator = Validator::make($request->all(), $rules);