Исключение 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,
которое возникает при ошибках запросов к базе данных