SnyMaster
@SnyMaster
Будет работа пишите...

Возможно ли повторное использование экземпляра Validator?

Validator можно создать используя Validator facade. Например, из документации:
$validator = Validator::make($request->all(), [
            'title' => 'required|unique:posts|max:255',
            'body' => 'required',
        ]);


Далее можно проверить результат валидации и выполнить какие-то действия:
if ($validator->fails()) {
            // что-то выполняем
        }


Validator имеет метод setData, которые позволяет задать набор данных для валидации. Можно после первого выполнения валидации заменить набор данных с помошью метода setData и используя имеющийся экземпляр Valdator провалидироать новый набор данных.
Не противоречит ли это идеологии Validator в Laravel? Дело в том, что ни в документации, ни в примерах использования Validator где-либо, не встречал ПОВТОРНОГО использования созданного экземпляра Validator. Но и не встречал каких-либо описаний ограничений.

Например, задача в консольном приложении получать в цикле ввод пользователя. Приложение обрабатывает ввод и ожидает следующий ввод, завершается приложение, например, по "Ctrl+C".
Упрощенный максимально код примерно такой:
$message = $this->ask(‘You message:’);

$validator = Validator::make([
 ‘message’ => $message,
], [
 ‘message’ => [‘required|max:200’],
]);

while (true){
 if ($validator->fails()) {
 //show errors
 } else {
 // do something
 }
 $message = $this->ask(‘You message:’);
 $validator->setData([‘message’ => $message]);
}
  • Вопрос задан
  • 110 просмотров
Решения вопроса 1
SnyMaster
@SnyMaster Автор вопроса
Будет работа пишите...
Итак , этот вопрос был задан из-за особенностей поведения валидатора. Надо было понять в чём причина одноразового использования экземпляра (инстанса) Validator.
Как я и предполагал, причина была банальная - баг.
Исправление было предложено https://github.com/laravel/framework/issues/28288. Сначала не понято, но позже осознано и включено как fix по предложению другого разработчика https://github.com/laravel/framework/commit/0e52e4...

На текущий момент ограничений на повторное использование экземпляра(инстанса) Validator и побочных эффектов нет.
И не забудьте обновить версию Laravel )
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
SerafimArts
@SerafimArts
Senior Notepad Reader
Validator::make как раз и создаёт новый инстанс.

P.S.1: А вообще хорошим тоном считается использование контрактов https://github.com/illuminate/contracts/blob/maste... через DI, а фасады только в самых крайних случаях (никогда).
P.S.2: В частном случае же валидации желательно использование форм-реквестов, а не контроллеров.
Ответ написан
Alex_Wells
@Alex_Wells
PHP/Kotlin
Валидатор может иметь и другие пропсы, которые могут менятся после вызова ->fails(). Это mutable обьект, так что я бы не стал такой херней маятся а создал бы новый инстенс валидатора (либо поправил свой код так, что бы таких вопросов не возникало).
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы