Как передать контекст в сериализатор Symfony?Php

Кемеровские программисты php общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Как передать контекст в сериализатор Symfony?

Сообщение Anonymous »

Я использую компонент Symfony Serializer вне фреймворка. У меня есть собственный нормализатор, и я хочу передать ему дополнительный контекст из такого поля:

Код: Выделить всё

class TariffDto
{
#[Context([EntityNormalizer::UNIQUE_ENTITY_FIELD => 'code'])]
public Product $product;
}
EntityNormalizer не расширяет какой-либо нормализатор, он просто реализует DenormalizerInterface (в данном случае мне не нужен NormalizerInterface):

Код: Выделить всё

class EntityNormalizer implements DenormalizerInterface
{
public const UNIQUE_ENTITY_FIELD = 'unique_entity_field';

private EntityManager $em;

public function __construct()
{
$this->em = Registry::getInstance()->EM;
}

public function supportsDenormalization(mixed $data, string $type, ?string $format = null, array $context = []): bool
{
return str_starts_with($type, 'App\\Entity\\') && (is_numeric($data) || is_string($data));
}

public function denormalize(mixed $data, string $type, ?string $format = null, array $context = [])
{
dump($context);
return $this->em->getRepository($type)->find($data);
}
}
И dump($context) выводит следующий результат:

Код: Выделить всё

^ array:3 [
"_read_attributes" => false
"cache_key" => "45e90c83367464cde5c29c1ac70e95f3-product"
"deserialization_path" => "product"
]
Я использую эту конфигурацию сериализатора:

Код: Выделить всё

$phpDocExtractor = new PropertyInfo\Extractor\PhpDocExtractor();
$typeExtractor   = new PropertyInfo\PropertyInfoExtractor(
typeExtractors: [$phpDocExtractor, new ReflectionExtractor()]
);
$serializer = new Serializer\Serializer(
normalizers: [
new BackedEnumNormalizer(),
new EntityNormalizer(), // my custom normalizer
new Serializer\Normalizer\ObjectNormalizer(
nameConverter: new Serializer\NameConverter\CamelCaseToSnakeCaseNameConverter(),
propertyTypeExtractor: $typeExtractor
),

new Serializer\Normalizer\ArrayDenormalizer(),
],
);
Что я делаю не так, что я упустил?

Я пробовал передавать разные контекстные ключи, в т.ч. существующий (

Код: Выделить всё

#[Context([DateTimeNormalizer::FORMAT_KEY => 'Y-m-d'])]
), но ничего не изменилось, у меня по-прежнему нет дополнительного контекста в методе денормализации.
Я нашел эту статью, и здесь она описана именно так, как я хочу, и я думаю этому парню это сработало.
Итак, где мой контекст?

Подробнее здесь: https://stackoverflow.com/questions/790 ... serializer
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Php»