Работа с формами

Для реализации создания и обновления сущности в CRUD, нужно научиться правильно работать с формами. Создавать формы самостоятельно, очень утомительное занятие. Сотни строк одинакового кода, обработка ошибок, защита от атак, все это придётся делать снова и снова.

Обычно фреймворки имеют встроенную поддержку генерации форм, которая состоит из набора функций, автоматизирующих рутину. В Laravel так было изначально, но затем формы выделили в отдельный компонент laravelcollective/html. В самом Laravel осталось буквально несколько элементов: защита от CSRF и поддержка дополнительных методов HTTP в HTML-формах.

LaravelCollective/HTML

Для установки этого компонента выполните эту команду:

$ composer require "laravelcollective/html"

Библиотечные функции

Эта библиотека включает в себя несколько десятков статических методов, формирующих различные элементы. Вот несколько примеров:

<?php

// Не забудьте открыть Tinker и попробовать поэкспериментировать с этими функциями

echo Form::submit('Click Me!');
// <input type="submit" value="Click Me!">

echo Form::radio('category_id', 1);
// <input name="category_id" type="radio" value="1">

echo Form::select('size', ['L' => 'Large', 'S' => 'Small']);
// <select name="size">
//     <option value="L">Large</option>
//     <option value="S">Small</option>
// </select>

// Остальные элементы можно подсмотреть в официальной документации

Особняком стоит генерация самого тега формы. Из-за того, что этот тег оборачивает все остальные элементы формы, он состоит из двух методов: один открывает форму, другой – закрывает:

<?php

// По умолчанию форме проставляется метод _POST_, но его можно изменить на любой другой:
// В поисковых формах нужен GET
{{Form::open(['url' => route('articles.index'), 'method' => 'GET'])}}
    {{Form::text('username')}}
    {{Form::submit('Click Me!')}}
{{Form::close()}}

# <form method="POST" action="http://localhost/foo/bar" accept-charset="UTF-8"><input name="_token" type="hidden">
# </form>

Наиболее интересная возможность в этом пакете – интеграция с ORM. В таком случае форма берёт на себя часть задач по обработке формы. Для этого вместо метода open используется метод model. Первым параметром в него передаётся тот объект, форма которого строится.

<?php

{{ Form::model($user, ['url' => route('users.store')]) }}
    {{ Form::label('name', 'Имя') }}
    {{ Form::text('name') }}
    {{ Form::label('email', 'Email') }}
    {{ Form::email('email') }}
    {{ Form::submit('Создать') }}
{{ Form::close() }}

Разница в том, что эта форма самостоятельно извлекает из объекта значения свойств и подставляет их в форму. Это полезно при редактировании или при выводе ошибок, когда не удалось выполнить нужное действие. В следующем уроке мы воспользуемся именно таким подходом, он значительно экономит время.

Данные формы

Любую информацию о HTTP-запросе, включая данные формы, можно получить из объекта $request. Laravel передаёт его в те экшены, которые явно указывают его в параметрах:

<?php

namespace App\Http\Controllers;

// Нужно импортировать класс и указывать его в экшене
use Illuminate\Http\Request;

class ArticleController extends Controller
{
    public function index(Request $request)
    {
        // Возвращает весь пользовательский ввод как из тела запроса (отправка форм),
        // так и из параметров запроса (query string)
        $input = $request->input();
        $value = $request->input('key'); // Получает значение по указанному ключу
        $value2 = $request->input('key2', 'default value'); // Принимает значение по умолчанию
    }
}

При реализации поисковых форм, данные формы должны оставаться внутри формы после запроса. Мы это наблюдаем повсеместно, особенно в поисковых системах. Для реализации такого поведения нужно выполнить два условия. Первое — передать данные в шаблон, второе — подставить их в нужные места. Для этого элементы библиотеки генерации формы принимают дополнительный параметр:

<?php

{{Form::open(['url' => route('articles.index'), 'method' => 'GET'])}}
    {{-- Имя пользователя передано из экшена --}}
    {{Form::text('username', $username)}}
    {{Form::submit('Click Me!')}}
{{Form::close()}}

Самостоятельная работа

  1. Установите и настройте пакет
  2. Убедитесь через Tinker что пакет работает

Дополнительные материалы

  1. Документация

Для полного доступа к курсу, нужна профессиональная подписка

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

Получить доступ
115
курсов
892
упражнения
2241
час теории
3196
тестов

Зарегистрироваться

или войти в аккаунт

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно.

  • 115 курсов, 2000+ часов теории
  • 800 практических заданий в браузере
  • 250 000 студентов

Нажимая кнопку «Зарегистрироваться», вы даёте своё согласие на обработку персональных данных в соответствии с «Политикой конфиденциальности» и соглашаетесь с «Условиями оказания услуг».

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Rambler
Логотип компании Bookmate
Логотип компании Botmother

Есть вопрос или хотите участвовать в обсуждении?

Зарегистрируйтесь или войдите в свой аккаунт

Нажимая кнопку «Зарегистрироваться», вы даёте своё согласие на обработку персональных данных в соответствии с «Политикой конфиденциальности» и соглашаетесь с «Условиями оказания услуг».