Symfony 4. Отменить регистрацию ObjectNormalizer - PullRequest
0 голосов
/ 04 мая 2018

Я хочу, чтобы процесс сериализации был явным, без использования нормализаторов объектов / свойств, как мне отменить их регистрацию?

http://symfony.com/doc/current/components/serializer.html#normalizers

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

Если вы хотите, чтобы ваш процесс сериализации был явным, вы можете зарегистрировать свой собственный нормализатор, как это следует в сервисах definition

AppBundle\Serializer\Your\MyObjectNormalizer:
    tags:
        - { name: serializer.normalizer }

Вы можете объявить нормализатор, как следует

namespace AppBundle\Serializer\Your; 
use Symfony\Component\Serializer\Normalizer\NormalizerInterface;

class MyObjectNormalizer implements NormalizerInterface
    {
    public function normalize($object, $format = null, array $context = [])
    {
        // $object is an instance of MyObject
        $groups = array_key_exists('groups', $context) ? $context['groups'] : [];

        $data = [
            'name' => $object->getName()
            // ..........
        ];
        if(array_key_exists('full', $groups)) {
            $data['owner'] = $object->getOwner()->getFullName();
        }
        return $data;
    }

    /**
     * Checks whether the given class is supported for normalization by this normalizer.
     *
     * @param mixed  $data   Data to normalize
     * @param string $format The format being (de-)serialized from or into
     *
     * @return bool
     */
    public function supportsNormalization($data, $format = null)
    {
        return $data instanceof MyObject;
    }
}

Если вы будете действовать как следует, Symfony увидит, что вы объявили пользовательский нормализатор для такого типа объектов. Таким образом, он примет ваш класс в первую очередь, чтобы нормализовать MyObject

Вы можете нормализовать данные из массива контекста

$myobject = new MyObject();

$fullObj = $this->container->get('serializer')->serialize($myobject, 'json', ['full']);

$lightObj = $this->container->get('serializer')->serialize($myobject, 'json');
// $fullObj is ['name' => 'someName', 'owner' => 'ownerName'];
// $lightObj is ['name' => 'someName'];

Взгляните на эту часть документации

0 голосов
/ 04 мая 2018

Я нашел способ, добавив пароль компилятора в Kernel::build:

class Kernel extends BaseKernel
{
    // ...

    protected function build(ContainerBuilder $container)
    {
        $container->addCompilerPass(new class implements CompilerPassInterface
        {
            public function process(ContainerBuilder $container)
            {
                $container->removeDefinition('serializer.normalizer.json_serializable');
                $container->removeDefinition('serializer.normalizer.object');
            }
        }, PassConfig::TYPE_BEFORE_OPTIMIZATION, 1);
    }
}

Приоритет = 1 заставляет его работать до SerializerPass, чтобы он работал.

UPD : совет @ Nek отключить сериализатор в конфигурации framework и зарегистрировать его сам, кажется хорошей идеей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...