Веб-приложения постоянно обрабатывают входящие данные от пользователей, и их валидация — критически важный аспект безопасности и стабильности приложения. Laravel предлагает мощные инструменты для проверки входящих запросов. В этой статье рассмотрим основные методы валидации тела HTTP-запроса в Laravel.
Почему валидация важна?
Правильная валидация данных позволяет:
- Обеспечить целостность данных
- Защитить приложение от некорректных данных
- Улучшить пользовательский опыт
- Предотвратить многие уязвимости
Методы валидации в Laravel
1. Валидация в контроллере
Самый простой способ — использовать метод validate()
объекта Request:
public function store(Request $request)
{
$validated = $request->validate([
'title' => 'required|string|max:255',
'content' => 'required|string|min:100',
'published_at' => 'nullable|date',
'author_id' => 'required|exists:authors,id'
]);
// Работа с проверенными данными
$post = Post::create($validated);
return response()->json($post, 201);
}
При невалидных данных Laravel автоматически сгенерирует исключение ValidationException
, которое будет обработано на уровне приложения.
2. Form Request — профессиональный подход
Для сложных сценариев лучше создать отдельный класс запроса:
php artisan make:request StorePostRequest
В созданном классе определим правила:
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class StorePostRequest extends FormRequest
{
public function authorize()
{
return true; // Или проверка прав доступа
}
public function rules()
{
return [
'title' => 'required|string|max:255',
'content' => 'required|string|min:100',
'meta.title' => 'nullable|string|max:60',
'tags' => 'array',
'tags.*' => 'integer|exists:tags,id',
'attachment' => 'file|mimes:pdf,docx|max:5120'
];
}
public function attributes()
{
return [
'meta.title' => 'meta title',
'tags.*' => 'tag'
];
}
}
Использование в контроллере:
public function store(StorePostRequest $request)
{
$validated = $request->validated();
$post = Post::create($validated);
return response()->json($post, 201);
}
3. Ручная валидация с Validator
Для особых случаев можно использовать фасад Validator:
use Illuminate\Support\Facades\Validator;
public function update(Request $request, Post $post)
{
$validator = Validator::make($request->all(), [
'title' => 'sometimes|string|max:255',
'status' => 'required|in:draft,published,archived'
]);
$validator->validate(); // Выбросит ValidationException при ошибках
$post->update($request->only(['title', 'status']));
return response()->json($post);
}
Правила валидации
Laravel предлагает множество встроенных правил:
Базовые правила:
required
,filled
,nullable
string
,integer
,boolean
,array
,date
email
,ip
,url
,uuid
Проверки значений:
min:value
,max:value
between:min,max
in:foo,bar,...
not_in:foo,bar,...
Проверки файлов:
file
,image
mimes:jpeg,png,pdf
max:1024
(размер в KB)
Проверки БД:
exists:table,column
unique:table,column
Специальные правила:
confirmed
(для password_confirmation)current_password
regex:/pattern/
Кастомизация сообщений об ошибках
Вы можете переопределить сообщения об ошибках:
public function messages()
{
return [
'title.required' => 'Заголовок обязателен для заполнения',
'content.min' => 'Содержание должно быть не менее :min символов',
'tags.*.exists' => 'Выбранный тег не существует'
];
}
Обработка ошибок валидации
Все ошибки валидации автоматически обрабатываются в App\Exceptions\Handler
. По умолчанию для веб-запросов Laravel перенаправляет назад с ошибками, а для API возвращает JSON-ответ с кодом 422.
Вы можете кастомизировать этот процесс, переопределив метод render()
в обработчике исключений.
Заключение
Laravel предоставляет гибкую систему валидации, которая покрывает большинство потребностей веб-приложения. Использование Form Request классов делает код чище и более поддерживаемым, особенно для сложных сценариев валидации.
Добавить комментарий