Выборочная проверка дат в Laravel 5.4 - PullRequest
0 голосов
/ 25 января 2019

Работа над приложением Laravel, посредством которого я работаю над проверкой серверной части двух дат. 2 даты в основном выездной даты и возвратной даты соответственно.

В день отъезда я подтвердил, что он должен быть обязательным, должен иметь дату типа и быть днем ​​позже сегодняшнего дня. В день возвращения я подтвердил, что он должен быть обязательным, должен быть типа даты и должен быть через 3 дня или более после даты отъезда. Вся эта логика проверки работает нормально.

Теперь я хочу реализовать проверку, в соответствии с которой дата возвращения должна составлять 3 дня или более после даты отъезда, но не должна превышать 180 дней после даты отъезда .

Функция проверки

public function validateDates(Request $request){   
    //dd($request->all());

    $validation = $this->validate($request, [
        'departureDate' => 'required|date|after:now',
        //Must be 3 days after departure date
        'returnDate' => ['required', 'date', 'returnDate_after:departureDate,3' ]
    ], 
    [
      'departureDate.after' => 'Your departure date should be tomorrow or any date in the future'
    ]
};

Пользовательский валидатор в сервис-провайдере приложений в методе загрузки

public function boot(){
     //Custom Validation
        Validator::extend('valid_birth_date', 
            function ($attribute, $value, $parameters, $validator){
                $date_different = date_diff(new \DateTime($value), new \DateTime())->y;
                return $date_different >= 18;
        });

        //Deparrure and return date should have a difference of 3 days
        $validator = app()->make(\Illuminate\Validation\Factory::class);
        $validator->extend('return_date_after', function ($attribute, $value, $parameters, $validator) {
              $otherAttribute = array_get($parameters, 0);
              //default 4 days
              $days = array_get($parameters, 1, 3); 
              $otherValue = array_get($validator->getData(), $otherAttribute);
              if (strtotime($value) < strtotime($otherValue) + $days*24*60*60) {
                return false;
              }
              return true;
        });

        $validator->replacer('return_date_after', function ($message, $attribute, $rule, $parameters) {
              return 'Your return date should be '.array_get($parameters,1,3).' days or more after your '.array_get($parameters, 0);
       });
       //End departure and return date
}
...