Laravel. Валидация данных. Часть первая из трех
19.09.2020
Теги: Laravel • Web-разработка • Теория • Форма • Фреймворк • ШаблонСайта
Laravel предоставляет несколько способов для валидации входящих данных. По умолчанию базовый контроллер использует трейт ValidatesRequests
, который обеспечивает удобный способ валидации HTTP-запросов c большим количеством правил валидации.
Простая валидация в контроллере
Давайте рассмотрим простой пример валидации формы и вывод сообщений об ошибках для пользователя.
- Определение роутов
- Создание контроллера
- Правила валидации
- Отображение ошибок
1. Определение роутов
Во-первых, представим что мы имеем следующие роуты в файле routes/web.php
:
Route::get('post/create', 'PostController@create'); Route::post('post', 'PostController@store');
Маршрут GET
отображает форму для создания нового поста в блоге, в то время как POST
будет сохранять новую запись в базе данных.
2. Создание контроллера
Во-вторых, создадим простой контроллер, который обрабатывает эти роуты. Реализуем метод create()
, а метод store()
пока оставим пустым.
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Http\Controllers\Controller; class PostController extends Controller { /** * Показать форму для создания новой записи блога * * @return Response */ public function create() { return view('post.create'); } /** * Сохранить в базу данных новую запись блога * * @param Request $request * @return Response */ public function store(Request $request) { // ..... } }
3. Правила валидации
Если посмотреть исходный код базового контроллера (App\Http\Controllers\Controller
), то можно увидеть, что он включает в себя трейт ValidatesRequests
, который обеспечивает все контроллеры методом validate()
. Метод принимает два параметра — экземпляр HTTP-запроса и правила валидации.
Если все правила валидации пройдены успешно — код выполняется дальше. Иначе будет выброшено исключение и сообщение об ошибке будет отправлено обратно пользователю. Ответ будет направлен обратно с заполненными flash-переменными, а на AJAX-запрос будет отправлен JSON.
/** * Сохранить в базу данных новую запись блога * * @param Request $request * @return Response */ public function store(Request $request) { $this->validate($request, [ 'title' => 'required|unique:posts|max:100', 'body' => 'required', ]); // проверка пройдена, можно записывать в БД }
Чтобы остановить выполнение остальных правил после первой неудачной проверки, нужно добавить bail
в начало списка всех правил:
$this->validate($request, [ 'title' => 'bail|required|unique:posts|max:100', 'body' => 'required', ]);
Если правило unique
для атрибута title
не выполняется, правило max
не проверяется.
Если данные HTTP-запроса содержат вложенные параметры, можно указать их, используя синтаксис с точкой:
$this->validate($request, [ 'title' => 'required|unique:posts|max:100', 'author.name' => 'required', 'body' => 'required', ]);
Начиная с версии Laravel 5.5 можно для валидации данных использовать метод validate()
объекта Illuminate\Http\Request
:
/** * Сохранить в базу данных новую запись блога * * @param Request $request * @return Response */ public function store(Request $request) { $request->validate([ 'title' => 'required|unique:posts|max:100', 'body' => 'required', ]); // проверка пройдена, можно записывать в БД }
4. Отображение ошибок
Мы уже знаем, что в случае ошибок пользователь будет перенаправлен на предыдущую страницу. Кроме того, все ошибки валидации будут автоматически записаны во flash-переменные. Нам не нужно явно передавать сообщения об ошибках в шаблоне роута GET
. Потому что Laravel будет проверять наличие ошибок в текущем сеансе и автоматически привязывать их к шаблону, если они доступны.
В нашем случае пользователь будет перенаправлен в метод create()
контроллера и можно отобразить сообщения об ошибках в шаблоне:
<!-- resources/views/post/create.blade.php --> <h1>Создать пост</h1> @if ($errors->any()) <div class="alert alert-danger"> <ul> @foreach ($errors->all() as $error) <li>{{ $error }}</li> @endforeach </ul> </div> @endif
С помощью директивы @error
можно быстро проверить, существуют ли сообщения об ошибках для данного атрибута. Внутри директивы @error
можно использовать переменную $message
, чтобы показать текст ошибки.
<input type="text" name="title" class="@error('title') is-invalid @enderror"> @error('title') <div class="alert alert-danger">{{ $message }}</div> @enderror
По умолчанию в Laravel включены глобальные посредники TrimStrings
и ConvertEmptyStringsToNull
. Они перечислены в свойстве $middleware
класса App\Http\Kernel
. Из-за этого нужно часто помечать дополнительные поля как nullable
, если не нужно, чтобы валидатор считал не действительным значение null
.
$this->validate($request, [ 'title' => 'required|unique:posts|max:100', 'body' => 'required', 'publish_at' => 'nullable|date', ]);
В этом примере мы указываем что поле publish_at
может быть null
или должно содержать дату. Если модификатор nullable
отсутствует, значение null
будет считаться недопустимым.
Дополнительно
- Laravel. Валидация данных. Часть третья из трех
- Laravel. Валидация данных. Часть вторая из трех
- Блог на Laravel 7, часть 9. Панель управления — создание, публикация, удаление комментариев
- Блог на Laravel 7, часть 8. Панель управления — CRUD для категорий, тегов и пользователей
- Блог на Laravel 7, часть 7. Панель управления — создание, публикация, удаление постов
- Блог на Laravel 7, часть 2. Регистрация и аутентификация, восстановление пароля
- Laravel. Отправка почты по событию
Поиск: Laravel • Web-разработка • Форма • Фреймворк • Шаблон сайта • Валидация • validate • route • Маршрут • Теория