РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
690 of 1392 menu

Исключение ValidationException

Исключение ValidationException выбрасывается фреймворком Laravel, когда переданные данные не проходят проверку через систему валидации. Это исключение является частью пространства имён Illuminate\Validation и используется автоматически при вызове метода validate у объекта запроса или фасада Validator. При возникновении исключения Laravel автоматически перенаправляет пользователя назад с сообщениями об ошибках в сессии, если запрос был обычным HTTP-запросом, или возвращает ответ в формате JSON для AJAX-запросов.

Базовый синтаксис

<?php use Illuminate\Validation\ValidationException; // Обычное использование (исключение выбрасывается автоматически) $validated = $request->validate([ 'name' => 'required|string|max:255', 'email' => 'required|email|unique:users', ]); ?>

Ручное выбрасывание исключения

В некоторых случаях может потребоваться вручную выбросить исключение ValidationException с собственными сообщениями об ошибках. Это можно сделать с помощью фасада Validator или метода withErrors у объекта запроса.

Пример ручного выбрасывания

Давайте выбросим исключение в контроллере при невыполнении определённого условия:

<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use Illuminate\Validation\ValidationException; class UserController extends Controller { public function store(Request $request) { if ($request->input('age') < 18) { throw ValidationException::withMessages([ 'age' => ['The user must be at least 18 years old.'] ]); } // Остальная логика return response()->json(['success' => true]); } } ?>

Результат выполнения кода при отправке запроса с возрастом 16:

{ "message": "The user must be at least 18 years old.", "errors": { "age": [ "The user must be at least 18 years old." ] } }

Получение ошибок из исключения

При отлове исключения можно получить список ошибок с помощью различных методов:

<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use Illuminate\Validation\ValidationException; class TestController extends Controller { public function test(Request $request) { try { $request->validate([ 'email' => 'required|email', 'password' => 'required|min:8', ]); } catch (ValidationException $e) { // Получаем все ошибки в виде массива $errors = $e->errors(); // Получаем сообщение ошибки $message = $e->getMessage(); // Получаем первый код ошибки (статус) $status = $e->status; // Выводим результат echo "Message: " . $message . "\n"; echo "Status: " . $status . "\n"; print_r($errors); } } } ?>

Результат выполнения кода при неудачной валидации:

"Message: The given data was invalid." "Status: 422" Array ( [email] => Array ( [0] => The email field is required. ) [password] => Array ( [0] => The password field is required. ) )

Кастомизация ответа

Для изменения формата ответа при исключении можно использовать метод render в классе Handler или создать собственное исключение-наследник. Также можно использовать метод withErrors для добавления ошибок в сессию:

<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use Illuminate\Validation\ValidationException; class ProfileController extends Controller { public function update(Request $request) { try { $validated = $request->validate([ 'name' => 'required|string|max:100', 'phone' => 'required|numeric|digits:10', ]); } catch (ValidationException $e) { // Добавляем кастомное сообщение $errors = $e->errors(); $errors['custom'] = ['Please check your input data.']; // Создаём новое исключение с дополнительными ошибками throw ValidationException::withMessages($errors); } // Обработка успешного сохранения return redirect()->route('profile.show')->with('success', 'Profile updated.'); } } ?>

Результат выполнения кода при ошибке валидации:

{ "message": "Please check your input data.", "errors": { "name": ["The name field is required."], "phone": ["The phone field is required."], "custom": ["Please check your input data."] } }

Обработка в контроллере

Если необходимо обработать ошибки валидации вручную и не полагаться на автоматическое перенаправление, можно использовать метод validate с опцией throw:

<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use Illuminate\Validation\ValidationException; use App\Models\Post; class PostController extends Controller { public function store(Request $request) { $validator = validator($request->all(), [ 'title' => 'required|string|max:100', 'content' => 'required|string|min:10', 'category_id' => 'required|exists:categories,id', ]); if ($validator->fails()) { $errors = $validator->errors()->toArray(); // Логируем ошибки \Log::error('Validation failed', $errors); // Выбрасываем исключение throw new ValidationException($validator); } $post = Post::create($validator->validated()); return response()->json([ 'success' => true, 'post' => $post, ], 201); } } ?>

Результат выполнения кода при ошибке:

{ "message": "The given data was invalid.", "errors": { "title": ["The title field is required."], "content": ["The content field must be at least 10 characters."] } }

Смотрите также

  • метод ValidationException,
    который обрабатывает ошибки валидации
  • класс Exceptions,
    который управляет обработкой исключений
  • метод render,
    который кастомизирует отображение исключений
  • исключение QueryException,
    которое возникает при ошибках запросов к базе данных
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить