Если вы посмотрите документы, вы обнаружите, что компонент сериализатора не имеет никакой службы serializer.denormalizer
, поэтому ваши классы не обнаруживаются при автоматическом обнаружении. Symfony Сервисные теги
Вам необходимо следовать и реализовать Normalizer, который реализует как нормализатор, так и денормализатор logi c в одном классе и зарегистрировать его как нормализатор Использование нормализатора и кодировщика
Тогда соглашение об именах сбивает с толку, как это звучит, но ваш нормализатор позаботится о денормализации, если он имеет DenormalizerInterface
, и нормализации, если он имеет NormalizerInfterface
, пометив ваши сериализованные логики c соответствующим методом, они будут называться соответственно.
Платформа API сама имеет примеры того, как работают оба: decorating-a-serializer-and-добавление дополнительных данных Вот как вы декорируете нормализатор в API платформа:
api / config / services.yaml
services:
'App\Serializer\ApiNormalizer':
decorates: 'api_platform.jsonld.normalizer.item'
arguments: [ '@App\Serializer\ApiNormalizer.inner' ]
Или вы можете зарегистрировать этот нормализатор в соответствии с symfony способом:
config / services.yaml
services:
get_set_method_normalizer:
class: Symfony\Component\Serializer\Normalizer\GetSetMethodNormalizer
tags: [serializer.normalizer]
Реализация:
namespace App\Serializer;
use Symfony\Component\Serializer\Normalizer\DenormalizerInterface;
use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
use Symfony\Component\Serializer\SerializerAwareInterface;
use Symfony\Component\Serializer\SerializerInterface;
final class ApiNormalizer implements NormalizerInterface, DenormalizerInterface, SerializerAwareInterface
{
private $decorated;
public function __construct(NormalizerInterface $decorated)
{
if (!$decorated instanceof DenormalizerInterface) {
throw new \InvalidArgumentException(sprintf('The decorated normalizer must implement the %s.', DenormalizerInterface::class));
}
$this->decorated = $decorated;
}
public function supportsNormalization($data, $format = null)
{
return $this->decorated->supportsNormalization($data, $format);
}
public function normalize($object, $format = null, array $context = [])
{
$data = $this->decorated->normalize($object, $format, $context);
if (is_array($data)) {
$data['date'] = date(\DateTime::RFC3339);
}
return $data;
}
public function supportsDenormalization($data, $type, $format = null)
{
return $this->decorated->supportsDenormalization($data, $type, $format);
}
public function denormalize($data, $class, $format = null, array $context = [])
{
return $this->decorated->denormalize($data, $class, $format, $context);
}
public function setSerializer(SerializerInterface $serializer)
{
if($this->decorated instanceof SerializerAwareInterface) {
$this->decorated->setSerializer($serializer);
}
}
}
Вы можете преломить свою логику c и создать класс нормализатора для каждой сущности. Независимо от того, какую БД вы используете, для PHP и Symfony это все объекты.
Go в полных документах, чтобы понять, как это реализовано: Документы Serializer