Laravel Custom Validation Order - PullRequest
       44

Laravel Custom Validation Order

0 голосов
/ 16 октября 2019

Я добавляю пользовательское правило проверки

Validator::extend('validate_timezone', function($attribute, $value, $parameters, $validator) {
    $items = request('items');
    $from_date = Carbon::createFromFormat('Y-m-d H:i:s', $item['from_date']);
    // my code below depend on $from_date
    ......
    ......

    return true;
);

правило проверки

 "from_date" => "required|date_format:Y-m-d H:i:s|validate_timezone",

проблема, пользовательская проверка validate_timezone выполняется до 'date_format:Y-m-d H:i:s', поэтому, если формат датынеправильно, я получу ошибку внутри validate_timezone функции

как я могу заставить проверить date_format:Y-m-d H:i:s перед пользовательской проверкой validate_timezone?

Ответы [ 2 ]

1 голос
/ 16 октября 2019

В документации можно найти следующее:

Правила будут подтверждены в порядке их присвоения.

Значение кодаработает как положено. Возможно, вы ищете параметр bail:

Иногда вы можете захотеть прекратить запуск правил проверки для атрибута после первого сбоя проверки. Для этого присвойте правило bail атрибуту

Что означает, что вы должны попробовать это:

"from_date" => "bail|required|date_format:Y-m-d H:i:s|validate_timezone",
0 голосов
/ 16 октября 2019

Сначала запускается пользовательское расширенное правило проверки, потому что оно, вероятно, определено в функции загрузки поставщика услуг, который запускается при каждом запросе, поэтому вам нужно перехватить исключение Carbon и вернуть false соответственно

public function boot()
{
    \Validator::extend('validate_timezone', function ($attribute, $value, $parameters, $validator) {
        try {
            $from_date = Carbon::createFromFormat('Y-m-d H:i:s', $value);
            return true;
        } catch (Exception $ex) {
            logger()->warning($ex->getMessage());
            return false;
        }
    });
}

Теперь, если carbon не может создать из переданного формата, он сгенерирует исключение, которое мы перехватываем, регистрируем и возвращаем false

И, как упомянуто @ PtrTon , вам нужно поручиться при первой проверкеfail

Теперь предполагается, что логика проверки выглядит следующим образом:

Route::post('/', function () {
    $validate = request()->validate([
        "from_date" => "bail|required|date_format:Y-m-d H:i:s|validate_timezone",
    ]);
    dd($validate);
});

И такая форма представления

<form action="/" method="post">
    @csrf
    <input type="datetime" name="from_date" value="2019-10-16 15:03">
    <button type="submit">Submit</button>
</form>
@if ($errors->any())
<div class="alert alert-danger">
    <ul>
        @foreach ($errors->all() as $error)
        <li>{{ $error }}</li>
        @endforeach
    </ul>
</div>
@endif

Значение date_from недопустимо для обоихdate_format и validate_timezone, но будет возвращено только сообщение об ошибке проверки date_format

enter image description here

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...