Объект класса Closure не может быть преобразован в строку при добавлении пользовательской проверки в Laravel. - PullRequest
0 голосов
/ 29 октября 2018

Я работаю над некоторыми настраиваемыми правилами проверки в Laravel, в соответствии с которыми я добавляю некоторую настраиваемую проверку 2 дат, где дата возвращения должна быть через 6 дней после даты отъезда. Я продолжаю получать следующую ошибку при добавлении настраиваемой проверки:

(1/1) ErrorException Объект класса Closure не может быть преобразован в строка в строке ValidationRuleParser.php 107

Пожалуйста, помогите

Контроллер

public function validatePlanEntries(Request $request)
{
    $validation = $this->validate($request, [
        'departure_date' => 'required|date|after:now',

        //Must be 6 days after departure date
        'return_date' => ['required', 'date', function ($attribute, $value, $fail) {
            if (strtotime($value) < strtotime(request('departure_date')) + 518400) {
                $fail('Departure date invalid');
            }
        }],
    ]);
}

1 Ответ

0 голосов
/ 29 октября 2018

Как вы упомянули в комментарии, вы используете версию Laravel, которая не поддерживает правила проверки обратного вызова, к сожалению, единственный способ сделать это - расширить валидатор новым правилом.

Добавьте это у одного из своих поставщиков услуг (например, AppServiceProvider)

public function boot() {
     //Other boot things

    $validator = app()->make(\Illuminate\Validation\Factory::class);
    $validator->extend('return_date_after', function ($attribute, $value, $parameters, $validator) {
          $otherAttribute = array_get($parameters, 0);
          $days = array_get($parameters, 1, 6); //default 6 days
          $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 must be '.array_get($parameters,1,6).' days after your '.array_get($parameters, 0);
   });
}

Тогда вы можете использовать это пользовательское правило как:

  $validation = $this->validate($request, [
        'departure_date' => 'required|date|after:now',

        //Must be 6 days after departure date
        'return_date' => ['required', 'date', 'return_date_after:departure_date,6' ]
    ]);

Обратите внимание, что $message в вашем заменителе происходит от resources/lang/<locale>/validation.php, так что вы можете добавить туда запись, такую ​​как "return_date_after", и манипулировать ею в вашем заменителе вместо возврата статического текста. Например:

"return_date_after" => "Your :attribute must be :days days after your :other_attribute"

И тогда ваш заменитель может быть:

 $validator->replacer('return_date_after', function ($message, $attribute, $rule, $parameters) {
      return str_replace([ ":days", ":other_attribute" ], 
          [ array_get($parameters, 1, 6), array_get($parameters,0) ], 
          $message);        
});
...