Новое в Symfony 6.3 — Полезная нагрузка запроса
Одной из важных особенностей архитектуры 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
на тот случай, если вы предпочитаете его и чтобы не ломать существующие приложения.