РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
259 of 1361 menu

Класс StreamedJsonResponse

Класс StreamedJsonResponse наследуется от StreamedResponse и позволяет отправлять JSON-данные клиенту частями, по мере их генерации. Это особенно полезно при работе с большими наборами данных, когда не хочется держать весь массив в памяти. Первым параметром передаётся массив данных, вторым - HTTP-статус, третьим - заголовки.

В отличие от JsonResponse, который кодирует весь массив целиком, StreamedJsonResponse обходит структуру данных рекурсивно и отправляет её по частям через callback-функцию.

Синтаксис

new StreamedJsonResponse(array $data, int $status = 200, array $headers = [])

Пример

Давайте отправим простой массив в виде потокового JSON-ответа из контроллера:

<?php namespace App\Controller; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\StreamedJsonResponse; use Symfony\Component\Routing\Attribute\Route; class ArticleController extends AbstractController { #[Route('/articles', name: 'article_index')] public function index(): StreamedJsonResponse { $data = ['a', 'b', 'c', 'd', 'e']; return new StreamedJsonResponse($data); } } ?>

Результат выполнения кода:

["a","b","c","d","e"]

Пример

Давайте отправим ассоциативный массив с данными статьи:

<?php namespace App\Controller; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\StreamedJsonResponse; use Symfony\Component\Routing\Attribute\Route; class ArticleController extends AbstractController { #[Route('/article', name: 'article_show')] public function show(): StreamedJsonResponse { $data = [ 'id' => 1, 'title' => 'article', 'text' => 'hello', 'published' => true, ]; return new StreamedJsonResponse($data); } } ?>

Результат выполнения кода:

{"id":1,"title":"article","text":"hello","published":true}

Пример

Давайте сгенерируем большой набор данных через генератор, чтобы показать преимущество потоковой отправки:

<?php namespace App\Controller; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\StreamedJsonResponse; use Symfony\Component\Routing\Attribute\Route; class ArticleController extends AbstractController { #[Route('/users', name: 'user_index')] public function index(): StreamedJsonResponse { $users = []; for ($i = 1; $i <= 1000; $i++) { $users[] = [ 'id' => $i, 'name' => 'user', ]; } return new StreamedJsonResponse($users); } } ?>

Результат выполнения кода (фрагмент):

[{"id":1,"name":"user"},{"id":2,"name":"user"},{"id":3,"name":"user"}]

Пример

Давайте укажем HTTP-статус и заголовки явно:

<?php namespace App\Controller; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\StreamedJsonResponse; use Symfony\Component\Routing\Attribute\Route; class ArticleController extends AbstractController { #[Route('/article/created', name: 'article_created')] public function created(): StreamedJsonResponse { $data = ['status' => 'hello']; return new StreamedJsonResponse( $data, 201, ['X-Custom-Header' => 'abcde'] ); } } ?>

Результат выполнения кода:

{"status":"hello"}

Смотрите также

  • класс JsonResponse,
    который формирует обычный JSON-ответ
  • класс StreamedResponse,
    который отправляет ответ потоком
  • класс Response,
    который представляет базовый HTTP-ответ
  • класс setData,
    который задаёт данные для JSON-ответа
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить