Самое время начать писать о новых возможностях Laravel 5.2! Вы наверняка заметите, что многие нововведения просты как в изучении, так и в использовании. Может даже показаться, что этот релиз меньше предыдущего. Но многие функции версии 5.2 сильно отразятся на простоте и удобстве повседневной работы.
Это одна из статей о новых функциях Laravel 5.2. Скоро будут ещё, не пропустите.
- Проверка массива формы в Laravel 5.2
- Неявная привязка модели маршрута в Laravel 5.2
- Ограничение скорости запросов API в Laravel 5.2
- Заготовка авторизации в Laravel 5.2
- Множественные драйверы защиты авторизации (включая API) в Laravel 5.2
Краткое введение в массивы html-форм
Проверка массива формы упрощает процесс проверки каких-либо нестандартных видов данных в HTML-формах при использовании массивов. Если вы с такими не сталкивались, то один из примеров их использования — когда вы разрешаете пользователю добавлять несколько экземпляров одинакового типа на одной форме.
Давайте предположим, что у вас есть форма, где пользователь добавляет компанию и может добавить в неё столько сотрудников, сколько захочет. У каждого сотрудника есть имя и должность.
Вот наш HTML. Предположим, что у нас есть некий JavaScript код, который создает новый div "employee" при нажатии на кнопку «Добавить сотрудника». И добавить их можно сколько угодно.
xml<form> <label>Название компании</label> <input type="text" name="Название"> <h3>Employees</h3> <div class="add-employee"> <label>Имя сотрудника</label> <input type="text" name="employee[1][name]"> <label>Должность сотрудника</label> <input type="text" name="employee[1][title]"> </div> <div class="add-employee"> <label>Имя сотрудника</label> <input type="text" name="employee[2][name]"> <label>Должность сотрудника</label> <input type="text" name="employee[2][title]"> </div> <a href="#" class="js-create-new-add-employee-box">Добавить сотрудника</a> <input type="submit"> </form>
Когда вы заполните и отправите эту форму, она будет в виде $_POST:
array(2) { ["name"]=> string(10) "Acme, Inc." ["employee"]=> array(2) { [1]=> array(2) { ["name"]=> string(10) "Joe Schmoe" ["title"]=> string(11) "Head Person" } [2]=> array(2) { ["name"]=> string(18) "Conchita Albatross" ["title"]=> string(21) "Executive Head Person" } } }
Как вы уже заметили, мы получаем «объект» employee, содержащий переданный массив ID c парами ключ/значение «имя поля» ⇒ «значение, введённое пользователем».
Общепринято просто создавать каждый экземпляр с полем «employee name». Например, просто employee[][name], не устанавливая ID вручную. Не делайте этого. Так будет намного сложнее работать с кодом.
Но как нам это проверить? До версии 5.2 это делалось вручную. Теперь же Laravel понимает эту вложенную структуру и может однозначно идентифицировать её.
Написание правил проверки массива формы
Как мы будем это делать? Давайте посмотрим на обычный валидатор:
// CompaniesController.php
public function store(Request $request)
{
$this->validate($request->all(), [
'name' => 'required|string'
]);
// Сохранение и т.д.
}
А теперь давайте добавим проверку для полей сотрудников нашей компании:
// CompaniesController.php
public function store(Request $request)
{
$this->validate($request->all(), [
'name' => 'required|string',
'employee.*.name' => 'required|string',
'employee.*.title' => 'string',
]);
// Сохранение и т.д.
}
Теперь мы однозначно проверяем каждое employee[*][name] и employee[*][title] без каких-либо усилий с нашей стороны. Просто и красиво.
PS
Вы, возможно, заметили, что форма валидатора employee.*.name содержит звёздочку в середине, которая как бы намекает нам, что мы могли бы поместить туда что-нибудь другое.
Что если вместо звёздочки, указывающей на «всех», вы вставите конкретное число? Оказывается в таком случае будет проверен только объект с указанным ID. Например, если вы вставите в проверочный массив employee.1.name вместо employee.*.name, то согласно этому правилу будет проверен только сотрудник с ID равным 1.
Я не знаю, зачем и когда вам это понадобится, но фактически вы можете установить отдельные правила проверки для каждого ID:
$this->validate($request->all(), [
'employee.1.name' => 'required|string',
'employee.2.name' => 'integer', // Не знаю, *зачем* вам это нужно, но это возможно
]);
Комментарии (2)
не работает этот метод он пишет -что первый аргумент($request->all(),) должен быть экземпляром класса Illuminate\Http\Request и все в таком роде только 2 дня зря потерял легче по старому вручную сделать
$request в данном примере содержит объект (экземпляр класса Illuminate\Http\Request).
Метод all(), примененный к нему, возвращает массив его атрибутов.
Чтобы валидатор работал, нужно передать в него $request вместо
$request->all()и массив правил:$this->validate($request, [...]);