Валидация в Laravel стала проще

Источник: «Validation in Laravel made easy»
Узнайте, как проверять входящие данные в приложениях Laravel, начиная с основ и заканчивая более сложными концепциями.

Оглавление

Введение в валидацию в Laravel

Валидация — как охранник у дверей веб-приложения. Она гарантирует, что только хорошие данные попадут внутрь, а грязные и нежелательные останутся снаружи. (Мне очень нравится эта аналогия! 😅)

Laravel, будучи дружелюбным и мощным PHP-фреймворком, предлагает надёжный набор инструментов валидации данных.

Давайте рассмотрим валидацию в Laravel, начав с простого и постепенно изучая более сложные сценарии.

Основы валидации в Laravel

Представьте, что вы создаёте на сайте форму, с помощью которой посетители могут подписаться на рассылку новостей. Необходимо убедиться, что они указывают имя и корректный адрес электронной почты. Вот здесь-то и пригодится валидация в Laravel.

В Laravel очень просто проверить входящие данные. Допустим, у вас есть маршрут для отправки формы рассылки:

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;

Route::post('/newsletter', function (Request $request) {
$validatedData = $request->validate([
'name' => 'required|min:3',
'email' => 'required|email',
]);

// Обработка проверенных данных...
});

В этом магическом приёме $request->validate() проверяется:

Если данные не прошли валидацию, Laravel автоматически перенаправляет пользователя обратно в форму, сообщая детали ошибки (они доступны в шаблонах Blade через переменную $errors). Если всё прошло, ваши проверенные данные готовы к работе.

Извлечение логики валидации

Вы видели правила валидации в маршрутах, но иногда, особенно в сложных формах, необходимо более чётко разделить задачи. Именно здесь на помощь приходит Form Request Validation — более организованный способ обработки логики проверки.

Сначала следует создать пользовательский запрос формы:

php artisan make:request StoreNewsletterRequest

Эта команда создаёт класс, в котором вы можете определить правила валидации:

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class StoreNewsletterRequest extends FormRequest
{
public function authorize()
{
return true; // Кто угодно может отправить форму
}

public function rules()
{
return [
'name' => 'required|min:3',
'email' => 'required|email',
];
}
}

Затем используйте его в методе контроллера:

public function store(StoreNewsletterRequest $request)
{
// Данные были проверены, теперь вы можете получить к ним доступ.
$validated = $requestvalidated();
}

Благодаря извлечению в запрос формы ваш контроллер остаётся чистым, а логика проверки — аккуратно инкапсулированной.

Больше правил валидации, предоставляемых Laravel

Laravel предлагает широкий диапазон встроенных правил валидации для различных сценариев: проверка чисел, обеспечение уникальности в базе данных, проверка загрузки файлов и многое другое.

Например, проверка возраста пользователя может быть очень простой:

'age' => 'required|integer|min:18',

Это гарантирует, что возраст указан (required), является числом (integer) и не меньше 18 (min:18).

Вы можете ознакомиться с правилами валидации, предоставляемыми Laravel, в официальной документации.

Пользовательские сообщения об ошибках

Иногда требуется предоставить конкретную обратную связь при ошибке валидации. Laravel позволяет легко настроить сообщения об ошибках для каждого правила:

$request->validate([
'email' => 'required|email',
], [
'email.required' => 'Нам обязательно нужен ваш адрес электронной почты!',
'email.email' => "Хм, это не похоже на валидный e-mail.",
]);

Таким образом, вы сделаете своё приложение не только более удобным для пользователя, но и более уникальным и ориентированным на вашу аудиторию.

Продвинутые концепции валидации

По мере углубления в работу вы можете столкнуться со сценариями, требующими больше, чем просто базовые правила валидации. Здесь на помощь приходит способность Laravel задавать пользовательские правила валидации.

Создать пользовательское правило очень просто. Например, давайте создадим правило, гарантирующее, что строка будет в верхнем регистре (это было бы глупо в реальном проекте, но давайте пока упростим задачу). Сначала создадим правило:

php artisan make:rule Uppercase

Затем определяем его поведение:

namespace App\Rules;

use Closure;
use Illuminate\Contracts\Validation\ValidationRule;

class Uppercase implements ValidationRule
{
public function passes(string $attribute, mixed $value, Closure $fail)
{
if (strtoupper($value) !== $value) {
return $fail(':attribute must be uppercase.');
}
}
}

И наконец, вы можете использовать его где захотите:

use App\Rules\Uppercase;

$request->validate([
'last_name' => ['required', new Uppercase],
]);

Использование пользовательских правил позволяет сохранить выразительность логики приложения, удовлетворяя конкретным требованиям.

Валидация вложенных данных (или массивов)

Работаете с массивами или полезной нагрузкой JSON? Laravel прикроет вас благодаря точечной нотации и подстановочному символу * для данных массивов:

'person' => 'required|array',
'person.*.email' => 'email|unique:users',

Это правило проверяет, что каждый email в массиве требуемых person уникален в таблице пользователей.

Хотите узнать больше о валидации массивов? Вот отдельная статья: Простая целостность данных с проверкой массивов в Laravel.

Отображение сообщений об ошибках и пользовательских ответов

Laravel делает обработку ошибок валидации простой и понятной. Они передаются в сессию, что делает их доступными при перенаправлении. На AJAX-запросы Laravel отвечает JSON-файлом, содержащим ошибки.

В шаблонах Blade отобразить ошибки проще простого. Например, вы можете отобразить их в верхней части формы следующим образом:

@if ($errors->any())
<div>
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif

Или отобразите их под полями:

<div>
<label for="name">
Name
</label>

<input
type="text"
id="name"
name="name"
value="{{ old('name') }}"
placeholder="Ned Flanders"
/>

@error('name')
<p>{{ $message }}</p>
@enderror
</div>

Заключение

Валидация — важнейшая часть любого веб-приложения, а Laravel предлагает одну из самых мощных и гибких систем для обеспечения целостности данных.

Ключ к освоению валидации Laravel — практика:

Вы можете сделать это!

Дополнительные материалы

Предыдущая Статья

Простая целостность данных с валидацией массивов в Laravel

Следующая Статья

Пора заменить MySQL и PostgreSQL на SQLite