Зарегистрируйтесь, чтобы продолжить обучение

Работа с формами PHP: Разработка на Laravel

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

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

LaravelCollective/HTML

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

composer require spatie/laravel-html

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

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

<?php

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

echo html()->submit('Click me');
// => <button type="submit">Click me</button>

echo html()->radio('category_id', false, 1);
// => <input type="radio" name="category_id" id="category_id_1" value="1">

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

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

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

<?php

// По умолчанию форме проставляется метод _POST_, но его можно изменить на любой другой:
// В поисковых формах нужен GET
{{  html()->form('GET', route('articles.index'))->open() }}
        {{  html()->input('text', 'name') }}
        {{  html()->submit('Search') }}
{{ html()->form()->close() }}

// <form method="GET" action="http://localhost/articles">
//     <input type="text" name="name" id="name">
//     <button type="submit">Search</button>
// </form>

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

<?php
{{ html()->modelForm($article, 'POST', route('articles.store'))->open() }}
    {{  html()->label('Имя', 'name') }}
    {{  html()->input('text', 'name') }}
    {{  html()->label('Содержание', 'body') }}
    {{  html()->textarea('body') }}
    {{ html()->submit('Save') }}
{{ html()->closeModelForm() }}

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

Данные формы

Любую информацию о 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
{{  html()->form('GET', route('articles.index'))->open() }}
        {{-- Название статьи передано из экшена --}}
        {{  html()->input('text', 'name', $name) }}
        {{  html()->submit('Search') }}
{{ html()->form()->close() }}

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

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

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

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

Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты

Для полного доступа к курсу нужен базовый план

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

Получить доступ
1000
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

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

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

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

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff
Рекомендуемые программы
профессия
Программирование на PHP, Разработка веб-приложений и сервисов используя Laravel, проектирование и реализация REST API
10 месяцев
с нуля
Старт 2 января

Используйте Хекслет по-максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

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

Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»