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]);
}
  • Вопрос задан
  • 107 просмотров
Решения вопроса 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 обьект, так что я бы не стал такой херней маятся а создал бы новый инстенс валидатора (либо поправил свой код так, что бы таких вопросов не возникало).
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы