Атрибут Groups
Атрибут Groups вешается на свойство или метод
класса и позволяет указать, к каким группам сериализации
относится это свойство. Первым параметром передаётся
массив имён групп. При сериализации Symfony включает
в результат только те свойства, которые входят в
указанные группы. Это позволяет гибко управлять
составом выходных данных без создания отдельных классов.
Синтаксис
#[Groups(['group_name'])]
Пример
Давайте создадим сущность Article с двумя группами: 'list' и 'detail':
<?php
namespace AppEntity;
use SymfonyComponentSerializerAnnotationGroups;
class Article
{
#[Groups(['list', 'detail'])]
public string $title = 'hello';
#[Groups(['detail'])]
public string $text = 'abcde';
#[Groups(['list', 'detail'])]
public integer $views = 100;
}
?>
Теперь сериализуем объект с группой 'list':
<?php
namespace AppController;
use AppEntityArticle;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentSerializerSerializerInterface;
use SymfonyComponentSerializerAnnotationGroups;
class ArticleController extends AbstractController
{
public function index(SerializerInterface $serializer): Response
{
$article = new Article();
$res = $serializer->serialize(
$article,
'json',
[Groups::class => ['list']]
);
return new Response($res);
}
}
?>
Результат выполнения кода:
{"title":"hello","views":100}
Пример
Давайте сериализуем тот же объект с группой 'detail':
<?php
namespace AppController;
use AppEntityArticle;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentSerializerSerializerInterface;
use SymfonyComponentSerializerAnnotationGroups;
class ArticleController extends AbstractController
{
public function index(SerializerInterface $serializer): Response
{
$article = new Article();
$res = $serializer->serialize(
$article,
'json',
[Groups::class => ['detail']]
);
return new Response($res);
}
}
?>
Результат выполнения кода:
{"title":"hello","text":"abcde","views":100}
Пример
Атрибут Groups можно комбинировать с атрибутом
SerializedName для переименования полей:
<?php
namespace AppEntity;
use SymfonyComponentSerializerAnnotationGroups;
use SymfonyComponentSerializerAnnotationSerializedName;
class Article
{
#[Groups(['list'])]
#[SerializedName('article_title')]
public string $title = 'hello';
#[Groups(['list'])]
public integer $views = 100;
}
?>
Результат выполнения кода:
{"article_title":"hello","views":100}
Смотрите также
-
атрибут
SerializedName,
который переименовывает свойство при сериализации -
атрибут
Ignore,
который исключает свойство из сериализации -
атрибут
MaxDepth,
который ограничивает глубину вложенности -
метод
serialize,
который выполняет сериализацию объекта