Для реализации создания и обновления сущности в 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(['route' => 'articles.index', 'method' => 'GET'])}}
{{Form::text('username')}}
{{Form::submit('Click Me!')}}
{{Form::close()}}
# <form method="GET" action="http://localhost/articles" accept-charset="UTF-8">
# <input name="username" type="text">
# <input type="submit" value="Click Me!">
# </form>
Наиболее интересная возможность в этом пакете – интеграция с ORM. В таком случае форма берет на себя часть задач по обработке формы. Для этого вместо метода open
используется метод model
. Первым параметром в него передается тот объект, форма которого строится.
<?php
{{ Form::model($user, ['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(['route' => 'articles.index', 'method' => 'GET'])}}
{{-- Имя пользователя передано из экшена --}}
{{Form::text('username', $username)}}
{{Form::submit('Click Me!')}}
{{Form::close()}}
Самостоятельная работа
- Установите и настройте пакет
- Убедитесь через Tinker что пакет работает
Дополнительные материалы
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
- Статья «Как учиться и справляться с негативными мыслями»
- Статья «Ловушки обучения»
- Статья «Сложные простые задачи по программированию»
- Вебинар «Как самостоятельно учиться»
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.