Атрибут 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,
который исключает свойство из сериализации