@@ -636,39 +636,59 @@ Streaming a JSON Response
636
636
637
637
.. versionadded :: 6.2
638
638
639
- The :class: `Symfony\\ Component\\ HttpFoundation\\ StreamedJsonResponse ` class allows
640
- an API to return a lot of data as JSON and keep the used resources low by make usage
641
- of Generators.
639
+ The :class: `Symfony\\ Component\\ HttpFoundation\\ StreamedJsonResponse ` class was
640
+ introduced in Symfony 6.2. It allows an API to return a lot of data as JSON and keep
641
+ the used resources low by make usage of Generators.
642
642
643
- It expects a JSON structure with one or multiple replacers identifiers, as example
644
- the `'__articles__' `. As a second argument it requires one or multiple Generators
645
- which items can be converted to a JSON via ``json_encode `` method. The key of the
646
- Generators requires to be the used replacer identifiers::
643
+ It expects an array which represents the JSON structure and the list which should be
644
+ streamed are represented in the array as ``\Generator ``. The response will stream this
645
+ JSON with generators in to most efficient way and keep resources as low as possible::
647
646
648
647
use Symfony\Component\HttpFoundation\StreamedJsonResponse;
649
648
649
+ function loadArticles(): \Generator { // any method or function returning a Generator
650
+ yield ['title' => 'Article 1'];
651
+ yield ['title' => 'Article 2'];
652
+ yield ['title' => 'Article 3'];
653
+ });
654
+
650
655
$response = new StreamedJsonResponse(
651
- // json structure with replace identifiers
656
+ // json structure with generators in which will be streamed as a list
652
657
[
653
658
'_embedded' => [
654
- 'articles' => '__articles__',
659
+ 'articles' => loadArticles(), // any \Generator can be used which will be streamed as list of data
655
660
],
656
661
],
657
- // array of generators with replace identifier used as key
658
- [
659
- '__articles__' => (function (): \Generator { // any method or function returning a Generator
660
- yield ['title' => 'Article 1'];
661
- yield ['title' => 'Article 2'];
662
- yield ['title' => 'Article 3'];
663
- })(),
664
- ]
665
662
);
666
663
667
664
.. tip ::
668
665
669
666
If loading data via doctrine the ``toIterable `` method of ``Doctrine `` can be
670
667
used to keep also the resources low and fetch only one row one by one.
671
- See the `Doctrine Batch processing `_ documentation for more.
668
+ See the `Doctrine Batch processing `_ documentation for more::
669
+
670
+ public function __invoke(): Response
671
+ {
672
+ return new StreamedJsonResponse(
673
+ [
674
+ '_embedded' => [
675
+ 'articles' => $this->loadArticles(),
676
+ ],
677
+ ],
678
+ );
679
+ }
680
+
681
+ public function loadArticles(): \Generator
682
+ {
683
+ $queryBuilder = $entityManager->createQueryBuilder();
684
+ $queryBuilder->from(Article::class, 'article');
685
+ $queryBuilder->select('article.id')
686
+ ->addSelect('article.title')
687
+ ->addSelect('article.description');
688
+
689
+ return $queryBuilder->getQuery()->toIterable();
690
+ }
691
+
672
692
673
693
Serving Files
674
694
~~~~~~~~~~~~~
0 commit comments