Данные формы в виде массива в Laravel
В прошлых уроках данные формы брали
по одному полю - через input
для title, slug
и каждого инпута отдельно.
Когда полей два-три, так удобно.
Если их больше или набор меняется,
проще забрать всё сразу одним вызовом.
Объект Request, который
внедряется
в действие контроллера, умеет отдавать
все отправленные значения
ассоциативным массивом: ключ -
атрибут name поля, значение -
то, что пользователь ввёл или выбрал.
Метод all
Для этого служит метод all.
Он не принимает аргументов и возвращает
массив со всеми данными текущего запроса
- и GET-параметрами, и полями POST-формы:
<?php
$data = $request->all();
?>
Сравним с поштучным чтением.
После отправки формы с title
и slug оба варианта дают
один и тот же результат:
<?php
// по одному полю
$title = $request->input('title');
$slug = $request->input('slug');
// все поля сразу
$data = $request->all();
// $data['title'], $data['slug']
?>
Второй способ удобен, когда массив целиком передают в представление, сохраняют в базу или перебирают в цикле - не нужно заранее знать точный список имён полей в коде.
Пример с формой и контроллером
Пусть форма отправляет три поля методом POST, как в уроке про отправку POST:
<form action="/result" method="POST">
@csrf
<input name="title">
<input name="slug">
<input name="text">
<input type="submit">
</form>
В действии контроллера получим
все значения через all
и передадим массив в Blade:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class PostController extends Controller
{
public function result(Request $request)
{
$data = $request->all();
return view('post.result', ['data' => $data]);
}
}
?>
В массив попадут и служебные поля -
например, _token от директивы
@csrf. Если часть ключей
не нужна, её отфильтруют методами
only или except -
это разберём в следующих уроках.
Вывод массива в представлении
В шаблоне массив удобно обойти
циклом foreach.
Выведем каждую пару «имя поля -
значение» отдельным пунктом списка:
<ul>
@foreach ($data as $name => $value)
<li>{{ $name }}: {{ $value }}</li>
@endforeach
</ul>
Так можно быстро проверить, что форма действительно отправила ожидаемые поля, - полезно на этапе отладки перед сохранением в базу или валидацией.
Если нужны только значения без имён,
достаточно foreach ($data as $value).
Если наоборот - работать по известным
ключам, обращаются как к обычному
массиву PHP: $data['title'].
<?php
$data = $request->all();
dump($data);
?>
Практические задачи
Пусть в вашей форме есть произвольное
количество инпутов. После отправки
формы получите массив отправленных
значений через all.
Передайте этот массив в представление
и выведите данные в виде списка ul:
в каждом li - имя поля
и его значение.