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

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

Формы создаются обычным 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-запроса возвращалась бы ошибка.

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

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

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

@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',
    // …
];