Используйте настраиваемый нормализатор для изменения свойств класса

У меня есть объект с двумя свойствами: 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 и изменить ее свойства?

Спасибо!

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
0
2 283
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Попробуйте добавить это в свои методы supportsNormalization:

public function supportsNormalization($data, $format = null)
{
    return
        $this->normalizer->supportsNormalization($data, $format)
        && is_object($data) && $data instanceof Style::class
        ;
}

Спасибо за Ваш ответ! Он все еще не работает ... Если я добавлю var_dump($data), он распечатает только строку с содержимым свойства name и null для свойства photo ... Он никогда не распечатает полностью Styleentity

Carles 26.03.2018 17:52

Хорошо, я видел, что это работает, только если я использую формат json (не для json-ld и других форматов)

Carles 27.03.2018 18:32

Если вы хотите работать с json-ld, вам нужно украсить конкретный нормализатор платформы API: decorates: 'api_platform.jsonld.normalizer.item' ИЛИ для json decorates:'api_platform.jsonapi.normalizer.item' `

Athos 28.03.2018 11:29

Да, хорошо! вот что я искал!

Carles 28.03.2018 14:38

Другие вопросы по теме