Класс 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-ответа