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

Сейчас мы с вами разберемся с отправкой форм в Laravel и получением отправленных данных.

Пусть у нас есть контроллер Test, а в нем действие form с соответствующим представлением test.form:

<?php namespace App\Http\Controllers; use App\Http\Controllers\Controller; class TestController extends Controller { public function form() { return view('test.form'); } } ?>

Разместим в представлении какую-нибудь форму, например, форму и инпутом с именем text, ожидающим ввода какого-нибудь текста:

<form action=""> <input type="text" name="text"> <input type="submit"> </form>

Обратите внимание на то, что наша форма отправляется методом GET. Работа с методом POST имеет нюансы, которые мы будем изучать ниже.

Так как атрибут action формы пустой, то после нажатия форма отправится на этот же URL, то есть после отправки формы опять выполнится действие form.

Давайте получим значение отправленного инпута. В Laravel для этого существует специальный класс Request (Запрос), содержащий в себе данные формы (и некоторые другие данные, которые мы разберем позже).

Для того, чтобы использовать класс Request внутри нашего контроллера, его необходимо подключить через use, вот так:

<?php namespace App\Http\Controllers; use App\Http\Controllers\Controller; use Illuminate\Http\Request; // подключим класс Request class TestController extends Controller { public function form() { return view('test.form'); } } ?>

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

Для этого параметром действия следует передать какую-нибудь переменную (я назвал ее $request), указав типом этой переменной класс Request:

<?php public function form(Request $request) { return view('test.form'); } ?>

После проведенной инъекции внутри метода form будет доступна переменная $request, содержащая в себе объект нужного нам класса Request.

Вот полный код нашего контроллера:

<?php namespace App\Http\Controllers; use App\Http\Controllers\Controller; use Illuminate\Http\Request; class TestController extends Controller { public function form(Request $request) { // Здесь доступна переменная $request return view('test.form'); } } ?>

Для того, чтобы вывести значение какого-нибудь поля формы, необходимо использовать метод input, параметром передав ему имя инпута.

Давайте, например, выведем на экран значение инпута с именем text:

<?php namespace App\Http\Controllers; use App\Http\Controllers\Controller; use Illuminate\Http\Request; class TestController extends Controller { public function form(Request $request) { var_dump($request->input('text')); // введем переданное значение return view('test.form'); } } ?>

Как это будет работать: при первом заходе на наше действие var_dump выведет null, так как форма еще не была отправлена, а после отправки формы код действия выполнится еще раз и тогда и будет выведено введенное в инпут значение.

Вместо метода input можно использовать альтернативный способ - через свойство объекта $request:

<?php $text = $request->text; ?>

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

<?php if ($request->has('text')) { } ?>

Данный метод можно использовать для проверки отправки формы:

<?php namespace App\Http\Controllers; use App\Http\Controllers\Controller; use Illuminate\Http\Request; class TestController extends Controller { public function form(Request $request) { // Если форма была отправлена и есть поле text: if ($request->has('text')) { var_dump($request->input('text')); } return view('test.form'); } } ?>

Сделайте форму с инпутом, принимающим своим значением число. После отправки формы выведите через var_dump квадрат этого числа.

Модифицируйте предыдущую задачу так, чтобы квадрат переданного числа выводился в представлении над формой.

Сделайте форму с двумя инпутами, в которые будут вводится числа. После отправки формы выведите на экран сумму этих чисел, а форму уберите.

Два действия для формы

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

Пусть, например, действие form просто показывает форму, а действие result выполняется после отправки этой формы:

<?php namespace App\Http\Controllers; use App\Http\Controllers\Controller; use Illuminate\Http\Request; class TestController extends Controller { public function form() { // показ формы } public function result(Request $request) { // обработка формы } } ?>

Пусть действие result будет доступно по следующему адресу: /test/result/. Тогда в атрибуте action формы, являющейся представлением действия form, укажем этот адрес для отправки формы:

<form action="/test/result/"> <input type="text" name="text"> <input type="submit"> </form>

Получится, что после отправки формы выполнится уже действие result.

Давайте напишем код обоих действий:

<?php namespace App\Http\Controllers; use App\Http\Controllers\Controller; use Illuminate\Http\Request; class TestController extends Controller { public function form() { return view('test.form'); } public function result(Request $request) { $text = $request->input('text'); return view('test.result', ['text' => $text]); } } ?>

В представлении метода result выведем переданную переменную:

{{ $text }}

В каком-нибудь действии сделайте форму с тремя инпутами, в которые будут вводится числа. Отправьте эту форму на другое действие и выведите переданные числа в представлении этого действия.