Атрибут Context
Атрибут Context вешается на свойство
или метод сущности и передаёт дополнительные
опции в сериализатор при обработке этого
свойства. Первым параметром передаётся
ассоциативный массив с настройками контекста.
Например, можно указать группы сериализации,
формат даты или собственную логику обработки.
Атрибут работает совместно с классами
Serializer и ObjectNormalizer.
Синтаксис
#[Context(context)]
Пример
Давайте создадим сущность Article
и укажем для свойства createdAt
формат даты через атрибут Context:
<?php
namespace AppEntity;
use SymfonyComponentSerializerAnnotationContext;
class Article
{
public string $title;
public string $text;
#[Context([DateTimeNormalizer::FORMAT_KEY => 'Y-m-d'])]
public DateTime $createdAt;
}
?>
Теперь при сериализации дата будет выведена
в формате 'Y-m-d', а не в формате
по умолчанию.
Пример
Давайте сериализуем объект Article
с помощью Serializer и посмотрим
на результат:
<?php
namespace AppController;
use AppEntityArticle;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentSerializerSerializer;
use SymfonyComponentSerializerEncoderJsonEncoder;
use SymfonyComponentSerializerNormalizerObjectNormalizer;
use SymfonyComponentSerializerNormalizerDateTimeNormalizer;
use SymfonyComponentSerializerMappingClassMetadataFactory;
class ArticleController extends AbstractController
{
public function index(): Response
{
$article = new Article();
$article->title = 'hello';
$article->text = 'article';
$article->createdAt = new DateTime('2024-01-15');
$serializer = new Serializer(
[new DateTimeNormalizer(), new ObjectNormalizer()],
[new JsonEncoder()]
);
$res = $serializer->serialize($article, 'json');
return new Response($res);
}
}
?>
Результат выполнения кода:
{"title":"hello","text":"article","createdAt":"2024-01-15"}
Пример
Давайте зададим группы сериализации через
атрибут Context для разных свойств:
<?php
namespace AppEntity;
use SymfonyComponentSerializerAnnotationContext;
use SymfonyComponentSerializerAnnotationGroups;
class Article
{
#[Groups(['public'])]
public string $title;
#[Groups(['internal'])]
public string $text;
#[Context([AbstractNormalizer::GROUPS => ['public']])]
public string $author;
}
?>
Свойство author будет включено в вывод
только при сериализации с группой
'public', заданной через контекст.
Смотрите также
-
класс
Serializer,
который выполняет сериализацию и десериализацию -
метод
serialize,
который превращает объект в строку формата -
метод
denormalize,
который восстанавливает объект из массива -
атрибут
Groups,
который задаёт группы сериализации