Валидация
Что такое валидация
Валидация — это проверка входящих данных перед их использованием. Она защищает от некорректных, пустых или опасных значений: пустого заголовка, email без @, пароля короче 8 символов.
Валидация в контроллере
Метод validate принимает массив правил. Если данные не проходят — Laravel автоматически возвращает ошибки: редирект с ошибками для web, JSON 422 для API.
public function store(Request $request)
{
$validated = $request->validate([
'title' => 'required|string|max:255',
'body' => 'required|string|min:10',
'email' => 'required|email|unique:users',
'age' => 'nullable|integer|min:18|max:120',
]);
Post::create($validated);
}
Основные правила
required— поле обязательноstring— строкаemail— корректный emailinteger— целое числоmin:8/max:255— минимальная/максимальная длина или значениеbetween:18,120— диапазонin:admin,user— значение из спискаunique:users— уникально в таблицеconfirmed— совпадает с полем_confirmationnullable— может быть пустымdate— датаbefore:today/after:today— до/после датыimage— загруженный файл — изображениеexists:tags,id— существует в таблицеarray— массив
Form Request
Если правил много — их выносят в отдельный класс:
php artisan make:request StorePostRequest
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class StorePostRequest extends FormRequest
{
public function authorize(): bool
{
return true;
}
public function rules(): array
{
return [
'title' => 'required|string|max:255',
'body' => 'required|string|min:10',
];
}
public function messages(): array
{
return [
'title.required' => 'Заголовок обязателен',
];
}
}
Контроллер:
public function store(StorePostRequest $request)
{
Post::create($request->validated());
}
authorize() определяет, имеет ли пользователь право выполнить действие.
Кастомные правила
php artisan make:rule Uppercase
namespace App\Rules;
use Closure;
use Illuminate\Contracts\Validation\ValidationRule;
class Uppercase implements ValidationRule
{
public function validate(string $attribute, mixed $value, Closure $fail): void
{
if (strtoupper($value) !== $value) {
$fail('Поле :attribute должно быть в верхнем регистре');
}
}
}
Использование:
'title' => ['required', new Uppercase()],
Вывод ошибок в Blade
@if ($errors->any())
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
@endif
<input name="title" value="{{ old('title') }}">
old() возвращает предыдущее значение после ошибки.