У меня есть объект с двумя свойствами: name и photo. Свойство name считывается из базы данных, но мне нужно заполнить свойство photo другой информацией.
Я следил за учебником Написание нестандартного номализатора из документации и создал свой собственный нормализатор:
<?php
namespace App\Serializer;
use App\Entity\Style;
use Symfony\Component\Serializer\Normalizer\DenormalizerInterface;
use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
use Vich\UploaderBundle\Templating\Helper\UploaderHelper;
final class StyleNormalizer implements NormalizerInterface, DenormalizerInterface
{
private $normalizer;
private $uploaderHelper;
public function __construct(NormalizerInterface $normalizer, UploaderHelper $uploaderHelper)
{
if (!$normalizer instanceof DenormalizerInterface) {
throw new \InvalidArgumentException('The normalizer must implement the DenormalizerInterface');
}
$this->normalizer = $normalizer;
$this->uploaderHelper = $uploaderHelper;
}
public function denormalize($data, $class, $format = null, array $context = [])
{
return $this->normalizer->denormalize($data, $class, $format, $context);
}
public function supportsDenormalization($data, $type, $format = null)
{
return $this->normalizer->supportsDenormalization($data, $type, $format);
}
public function normalize($object, $format = null, array $context = [])
{
if ($object instanceof Style) {
$object->setPhoto('http://api-platform.com');
}
return $this->normalizer->normalize($object, $format, $context);
}
public function supportsNormalization($data, $format = null)
{
return $this->normalizer->supportsNormalization($data, $format);
}
}
Но свойство photo не заполнено необходимой информацией.
После небольшой отладки я обнаружил, что метод supportsNormalization выполняется два раза (для каждого элемента базы данных). Если я напечатаю переменную $data, я получу свойство сущности name в первый раз и свойство photo со значением null во второй раз. Я так и не получил всю сущность Style. Тогда метод supportsNormalitzation всегда возвращает false.
Как я могу получить полную сущность Style и изменить ее свойства?
Спасибо!






Попробуйте добавить это в свои методы supportsNormalization:
public function supportsNormalization($data, $format = null)
{
return
$this->normalizer->supportsNormalization($data, $format)
&& is_object($data) && $data instanceof Style::class
;
}
Хорошо, я видел, что это работает, только если я использую формат json (не для json-ld и других форматов)
Если вы хотите работать с json-ld, вам нужно украсить конкретный нормализатор платформы API: decorates: 'api_platform.jsonld.normalizer.item' ИЛИ для json decorates:'api_platform.jsonapi.normalizer.item' `
Да, хорошо! вот что я искал!
Спасибо за Ваш ответ! Он все еще не работает ... Если я добавлю
var_dump($data), он распечатает только строку с содержимым свойстваnameи null для свойстваphoto... Он никогда не распечатает полностьюStyleentity