Новое в Symfony 6.3 — Полезная нагрузка запроса

Источник: «New in Symfony 6.3: Request Payload»
В Symfony 6.3 добавлен метод getPayload() к объекту Request для получения содержимого POST и/или содержимого тела запроса.

Одной из важных особенностей архитектуры Symfony является использование объектов Request и Response. Они позволяют использовать объектно-ориентированный подход для получения и установки информации в запросах/ответах вместо того, чтобы иметь дело с базовыми суперглобальными массивами PHP:

$request->query->get('foo');   // аналогично $_GET['foo']
$request->request->get('foo'); // аналогично $_POST['foo']
$request->cookies->get('foo'); // аналогично $_COOKIES['foo']
$request->files->get('foo'); // аналогично $_FILES['foo']

Хотя новички быстро адаптируются к этому рабочему процессу, выражение $request->request->... является распространённым источником путаницы некоторых людей (Почему вы получаете запрос от запроса?, Что это за второй запрос?).

После долгих дискуссий по этому поводу в Symfony 6.3 мы, наконец, решили предоставить метод, альтернативный методу $request->request. Новый метод называется getPayload() и возвращает объект InputBag. Содержимое этого пакета — либо Request::$request, либо Request::toArray():

// Пример 1:
// запрос содержит только некоторые POST данные (например, `foo1: bar1` отправленные как `application/x-www-form-urlencoded`)
$request->getPayload()->all();
// возвращает PHP массив: ['foo1' => 'bar1']

// Пример 2:
// запрос содержит только содержимое тела в виде некоторых JSON-кодированных данных (например `{"foo2": "bar2"}`)
$request->getPayload()->all();
// возвращает JSON-декодированные данные как PHP массив: ['foo2' => 'bar2']

// Пример 3:
// запрос содержит как POST данные (`foo1: bar1`) так и содержимое тела JSON (`{"foo2": "bar2"}`)
$request->getPayload()->all();
// данные POST имеют приоритет над телом; результат: ['foo1' => 'bar1']

Имя payload (полезная нагрузка) было выбрано как наиболее близкое к определению полезной нагрузки в RFC 7231. Мы надеемся, что этот метод будет проще для понимания как новичками, так и опытными пользователями. В любом случае мы сохраним $request->request на тот случай, если вы предпочитаете его и чтобы не ломать существующие приложения.

Дополнительные материалы

Предыдущая Статья

Корпоративные менеджеры паролей

Следующая Статья

Laravel: Как отложить задания и слушателей в транзакциях базы данных