Может войдёшь?
Черновики Написать статью Профиль

Проверка массива формы в Laravel 5.2

перевод

Самое время начать писать о новых возможностях Laravel 5.2! Вы наверняка заметите, что многие нововведения просты как в изучении, так и в использовании. Может даже показаться, что этот релиз меньше предыдущего. Но многие функции версии 5.2 сильно отразятся на простоте и удобстве повседневной работы.

Это одна из статей о новых функциях Laravel 5.2. Скоро будут ещё, не пропустите.

  1. Проверка массива формы в Laravel 5.2
  2. Неявная привязка модели маршрута в Laravel 5.2
  3. Ограничение скорости запросов API в Laravel 5.2
  4. Заготовка авторизации в Laravel 5.2
  5. Множественные драйверы защиты авторизации (включая 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 понимает эту вложенную структуру и может однозначно идентифицировать её.

Написание правил проверки массива формы

Как мы будем это делать? Давайте посмотрим на обычный валидатор:

PHP
// CompaniesController.php
public function store(Request $request)
{
  
$this->validate($request->all(), [
    
'name' => 'required|string'
  
]);
  
// Сохранение и т.д.
}

А теперь давайте добавим проверку для полей сотрудников нашей компании:

PHP
// 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:

PHP
$this->validate($request->all(), [
  
'employee.1.name' => 'required|string',
  
'employee.2.name' => 'integer'// Не знаю, *зачем* вам это нужно, но это возможно
]);

Вот и всё. Наслаждайтесь!

Как вы считаете, полезен ли этот материал? Да Нет

Комментарии (2)

agma

не работает этот метод он пишет -что первый аргумент($request->all(),) должен быть экземпляром класса Illuminate\Http\Request и все в таком роде только 2 дня зря потерял легче по старому вручную сделать

VadimLeader

$request в данном примере содержит объект (экземпляр класса Illuminate\Http\Request).
Метод all(), примененный к нему, возвращает массив его атрибутов.
Чтобы валидатор работал, нужно передать в него $request вместо $request->all() и массив правил:

PHP
$this->validate($request, [...]);

Написать комментарий

Разметка: ? ?

Авторизуйся, чтобы прокомментировать.