Создание формы и валидация

Создание формы

Формы создаются через обычный HTML, только внутри формы добавляется директива @csrf, которая нужна для безопасной обработки формы (если точнее, чтобы нельзя было передавать данные с другого сайта). Без него форма работать не будет.

<form method="POST">
    @csrf
    <!-- поля формы -->
</form>

В файле routes/web.php должна быть создана страница для обработки POST-запросов.

# routes/web.php

Route::get('news/edit/{id}', 'NewsController@edit');
Route::post('news/edit/{id}', 'NewsController@edit');

Если бы  Route::post() не было, то при отправки POST-запроса возвращалась бы ошибка.

За автоматическую проверку CSRF отвечается middleware \App\Http\Middleware\VerifyCsrfToken().

Валидация формы

Сначала в шаблоне надо указать, где выводить ошибки валидации формы.

<!-- Вывод ошибок валидации формы -->

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

Также для элементов форм в случае ошибок можно выводить класс .is-invalid.

<input name="title" type="text" class="@error('title') is-invalid @enderror">

Сама валидация происходит через метод $request->validate().

# app/Http/Controllers/NewsController.php

public function edit(Request $request)
{

  // выполнять код, если есть POST-запрос
  if ($request->isMethod('post')) {

    // валидация формы
    $request->validate([
      'title'  => 'required|max:255',
      'body'   => 'required',
      'expire' => 'nullable|date',
    ]);

  }

}

На примере выше показано, что поле «title» является обязательным для заполнения, и если она не будет заполнена, то Laravel сделает редирект на предыдущую страницу и выведет ошибки.

Значение nullable означает, что поле может быть пустым. Если бы она не была указана, то показывалось бы сообщение «неправильный формат даты».

Также в форме могут передаваться массивы.

<input type="text" name="user[0][id]">
<input type="text" name="user[0][name]">

<input type="text" name="user[1][id]">
<input type="text" name="user[1][name]">

Задать валидацию массивов можно через код ниже:

$request->validate([
  'user.*.id'  => 'required',
]);

Различные способы валидации указаны на странице Способы валидации.

Вывод сообщений с ошибками на русском языке

Текст сообщений с ошибками хранится в файле resources/lang/ru/validation.php.

# resources/lang/ru/validation.php

return [
  'required' => 'Поле «:attribute» обязательно для заполнения',
  // …
];

Также можно указать текст ошибки для конкретного элемента формы через массив custom.

# resources/lang/ru/validation.php

// Сообщения валидации для $_POST['title']
return [
  // …
  'custom' => [
    'title' => [
      'required' => 'Не заполнено имя статьи',
      'max' => 'Превышено число символов для имени статьи',
    ],
  ],
];

Язык текущего сайта указывается в файле config/app.php.

# config/app.php

return [
  'locale' => 'ru',
  // …
];