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

Атрибут MaxDepth

Атрибут MaxDepth вешается на свойство класса и задаёт максимальную глубину сериализации для этого свойства. Первым параметром передаётся целое число - предельная глубина вложенности. Когда глубина достигает указанного значения, вложенные объекты больше не разворачиваются и вместо них возвращается null. Это защищает от бесконечной рекурсии при сериализации связанных сущностей.

Синтаксис

#[MaxDepth(depth)]

Пример

Давайте создадим сущность с полем title и сериализуем её:

<?php namespace App\Entity; use Symfony\Component\Serializer\Attribute\MaxDepth; class Article { public string $title; #[MaxDepth(1)] public Author $author; } ?>

Теперь сериализуем объект в JSON:

<?php namespace App\Controller; use App\Entity\Article; use App\Entity\Author; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Serializer\SerializerInterface; class ArticleController extends AbstractController { public function index(SerializerInterface $serializer): Response { $author = new Author(); $author->name = 'abcde'; $article = new Article(); $article->title = 'hello'; $article->author = $author; $json = $serializer->serialize($article, 'json', [ 'groups' => ['article'], ]); return new Response($json); } } ?>

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

{"title":"hello","author":{"name":"abcde"}}

Пример

Давайте ограничим глубину единицей и сериализуем объект с учётом контекста enable_max_depth:

<?php namespace App\Controller; use App\Entity\Article; use App\Entity\Author; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Serializer\SerializerInterface; class ArticleController extends AbstractController { public function index(SerializerInterface $serializer): Response { $author = new Author(); $author->name = 'abcde'; $article = new Article(); $article->title = 'hello'; $article->author = $author; $json = $serializer->serialize($article, 'json', [ 'enable_max_depth' => true, ]); return new Response($json); } } ?>

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

{"title":"hello","author":null}

Пример

Давайте рассмотрим более глубокую вложенность и установим предел равным двум:

<?php namespace App\Entity; use Symfony\Component\Serializer\Attribute\MaxDepth; class Comment { public string $text; #[MaxDepth(2)] public Article $article; } ?>

Теперь сериализуем комментарий:

<?php namespace App\Controller; use App\Entity\Article; use App\Entity\Author; use App\Entity\Comment; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Serializer\SerializerInterface; class CommentController extends AbstractController { public function index(SerializerInterface $serializer): Response { $author = new Author(); $author->name = 'abcde'; $article = new Article(); $article->title = 'hello'; $article->author = $author; $comment = new Comment(); $comment->text = 'user'; $comment->article = $article; $json = $serializer->serialize($comment, 'json', [ 'enable_max_depth' => true, ]); return new Response($json); } } ?>

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

{"text":"user","article":{"title":"hello","author":null}}

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

  • класс Serializer,
    который выполняет сериализацию и десериализацию
  • метод serialize,
    который превращает объект в строку формата
  • атрибут Groups,
    который задаёт группы сериализации
  • атрибут Ignore,
    который исключает свойство из сериализации
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить