Формы и валидация в Laravel

Бизюк Андрей

ВГТУ

2024-12-03

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

Laravel не предоставляет встроенных средств для создания HTML-форм, но вы можете использовать обычный HTML для создания форм. Однако, Laravel предоставляет некоторые помощники, которые могут упростить создание форм.

Помощник form()

Во первых, вы можете использовать помощник form(), который предоставляет несколько удобных методов для создания форм. Для использования этого помощника, вам нужно добавить сервис-провайдер Collective\Html\HtmlServiceProvider в массив providers в файле config/app.php, и добавить два алиаса в массив aliases:

'providers' => [
    // ...
    Collective\Html\HtmlServiceProvider::class,
    // ...
],

'aliases' => [
    // ...
    'Form' => Collective\Html\FormFacade::class,
    'Html' => Collective\Html\HtmlFacade::class,
    // ...
],

Затем вы можете использовать методы Form::open(), Form::close(), Form::text(), Form::submit() и другие для создания форм. Например:

{{ Form::open(['url' => '/posts']) }}

    {{ Form::label('title', 'Title:') }}
    {{ Form::text('title') }}

    {{ Form::label('body', 'Body:') }}
    {{ Form::textarea('body') }}

    {{ Form::submit('Create Post') }}

{{ Form::close() }}

В этом примере мы создаем форму для создания новой статьи. Мы используем метод Form::open() для создания тега <form>, и передаем в него массив с параметрами. Мы используем методы Form::label() и Form::text() для создания поля ввода заголовка, и методы Form::label() и Form::textarea() для создания поля ввода тела статьи. Наконец, мы используем метод Form::submit() для создания кнопки отправки формы, и метод Form::close() для закрытия тега </form>.

Обратите внимание, что вы также можете использовать помощник Html для создания HTML-элементов, таких как заголовки, ссылки, изображения и другие. Например:

{{ Html::ul(['class' => 'nav'], $menuItems) }}

В этом примере мы создаем список навигации с помощью метода Html::ul().

Laravel Collective

Еще одним популярным пакетом для создания форм в Laravel является Laravel Collective. Этот пакет предоставляет множество удобных методов для создания форм, и он полностью совместим с Laravel. Вы можете установить его с помощью Composer:

composer require laravelcollective/html

После установки пакета, вы можете использовать его методы для создания форм, как показано выше.

Обратите внимание, что Laravel также предоставляет возможность создания форм с помощью JavaScript. Вы можете использовать фреймворк Vue.js, который входит в состав Laravel, для создания динамических форм. Дополнительную информацию вы можете найти в документации Laravel.

Получение данных

После отправки формы на сервер, вы можете получить ее результаты с помощью объекта Request. Объект Request предоставляет множество методов для получения данных из формы.

Методы

Во-первых, вы можете использовать метод all(), чтобы получить все данные из формы в виде массива. Например:

public function store(Request $request)
{
    $data = $request->all();

    // ...
}

В этом примере мы получаем все данные из формы и сохраняем их в переменной $data.

Во-вторых, вы можете использовать методы get(), input(), post(), file() и другие для получения конкретных данных из формы. Например:

public function store(Request $request)
{
    $title = $request->input('title');
    $body = $request->post('body');
    $file = $request->file('image');

    // ...
}

В этом примере мы получаем значение поля title с помощью метода input(), значение поля body с помощью метода post(), и файл из поля image с помощью метода file().

В-третьих, вы можете использовать методы has(), filled(), exists() и другие для проверки наличия данных в форме. Например:

public function store(Request $request)
{
    if ($request->has('title')) {
        // ...
    }

    if ($request->filled('body')) {
        // ...
    }

    if ($request->exists('published')) {
        // ...
    }

    // ...
}

В этом примере мы проверяем, существует ли поле title с помощью метода has(), не пустое ли поле body с помощью метода filled(), и существует ли поле published с помощью метода exists().

Обратите внимание, что если вы используете метод post() для получения данных из формы, то ваша форма должна использовать метод POST. Если вы используете метод get(), то ваша форма должна использовать метод GET.

Если вам нужно получить данные из файла, отправленного через форму, вы можете использовать методы store(), storeAs(), move() и другие, предоставляемые объектом UploadedFile. Например:

public function store(Request $request)
{
    $file = $request->file('image');

    $file->store('images');

    // ...
}

В этом примере мы сохраняем файл из поля image в директорию storage/app/images с помощью метода store().

Валидация

Laravel предоставляет несколько удобных способов для обработки форм и валидации входящих данных. Вот некоторые из них:

Validation Request

Этот метод позволяет создавать классы запросов, которые автоматически валидируют входящие данные. Вы можете создать новый класс запроса с помощью команды php artisan make:request StorePostRequest. Затем вы можете определить правила валидации в методе rules() этого класса. Наконец, вы можете использовать этот класс в вашем контроллере, указав его тип в качестве параметра метода.

public function store(StorePostRequest $request)
{
    // The incoming request is valid...
}

Validator Facade

Этот метод позволяет валидировать данные с помощью фасада Validator. Вы можете создать новый экземпляр валидатора, передав в него данные и правила валидации. Затем вы можете вызвать метод fails(), чтобы проверить, прошла ли валидация.

use Illuminate\Support\Facades\Validator;

$validator = Validator::make($request->all(), [
    'title' => 'required|unique:posts|max:255',
    'body' => 'required',
]);

if ($validator->fails()) {
    // Validation failed...
}

Form Request Validation

Этот метод позволяет валидировать данные непосредственно в контроллере. Вы можете использовать метод validate(), передав в него правила валидации. Если валидация не пройдена, пользователь будет автоматически перенаправлен обратно с ошибками.

public function store(Request $request)
{
    $request->validate([
        'title' => 'required|unique:posts|max:255',
        'body' => 'required',
    ]);

    // The incoming request is valid...
}

Automatic Injection Validation

Laravel может автоматически внедрять экземпляр Validator в ваш контроллер. Вы можете просто добавить Validator $validator в качестве параметра вашего метода, и Laravel автоматически внедрит экземпляр Validator.

use Illuminate\Validation\Validator;

public function store(Request $request, Validator $validator)
{
    $validator = $validator->make($request->all(), [
        'title' => 'required|unique:posts|max:255',
        'body' => 'required',
    ]);

    if ($validator->fails()) {
        // Validation failed...
    }
}