Callback on serializer Symfony

前端 未结 4 1642
借酒劲吻你
借酒劲吻你 2020-12-21 16:45

I\'m running Symfony 2.7 and I\'m trying output an object (Doctrine entity) as JSON.

When I\'m normalizing the object I want to convert some of it\'s values. To do t

4条回答
  •  天涯浪人
    2020-12-21 17:01

    The default Serializer service is created during dependency injection phase, and the Serializer interface do not allow editing of (full) retrieval of normalizers.

    I think you have (at least) three choice here:

    1. add your custom normalizer to the default Serializer service
    2. add NormalizableInterface to your entities
    3. create a new Serializer service (or a local object as suggested by the docs) as you were trying to do.

    I think in your scenario, case 1 is preferred (since 2 becomes boring pretty fast).

    I would do something like this; first create a custom Normalizer

    format(\DateTime::ISO8601);
        }
    
        /**
         * {@inheritdoc}
         */
        public function denormalize($data, $class, $format = null, array $context = array())
        {
            return new $class($data);
        }
    
        /**
         * Checks if the given class is a DateTime.
         *
         * @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 \DateTime;
        }
    
        /**
         * Checks if the given class is a DateTime.
         *
         * @param mixed  $data   Data to denormalize from.
         * @param string $type   The class to which the data should be denormalized.
         * @param string $format The format being deserialized from.
         *
         * @return bool
         */
        public function supportsDenormalization($data, $type, $format = null)
        {
            $class = new \ReflectionClass($type);
    
            return $class->isSubclassOf('\DateTime');
        }
    }
    

    Then register it to your services:

    # app/config/services.yml
    services:
        datetime_normalizer:
            class: AppBundle\DateTimeNormalizer
            tags:
                - { name: serializer.normalizer }
    

提交回复
热议问题