php – 序列化程序Symfony上的回调

我正在运行Symfony 2.7,我正在尝试输出一个对象(Doctrine实体)作为 JSON.

当我正在标准化对象时,我想转换它的一些值.要做到这一点,我在the documentation中找到了“setCallbacks”方法,但我对如何将它应用于我的案例感到有点困惑.

有没有办法在调用Symfonys序列化服务器时设置的规范化器上调用“setCallbacks”方法

这是我正在努力实现的一个简短示例:

//ExampleController.PHP

public function getJSONOrderByIdAction($id) {
    $serializer = $this->get('serializer');
    $normalizer = $serializer->getNormalizer(); // <- This is what I'm unable to do

    $dateTimeToString = function ($dateTime) {
        return $dateTime instanceof \DateTime ? $dateTime->format(\DateTime::ISO8601) : '';
    };

    $normalizer->setCallbacks(['time' => $dateTimeToString]);


    $order = $this->getDoctrine()->find("AppBundle:Order",$id);

    return new JsonResponse(["order" => $serializer->normalize($order,null,["groups" => ["public"]])]);
}

我知道大多数人已经切换到JMS序列化器.看起来好像内置的序列化程序应该能够处理我想要实现的内容.

默认的Serializer服务是在依赖项注入阶段创建的,而Serializer接口不允许编辑(完全)检索规范化程序.

我想你在这里有(至少)三种选择:

>将自定义规范化程序添加到默认的Serializer服务
>将NormalizableInterface添加到您的实体
>按照您的尝试创建新的Serializer服务(或文档建议的本地对象).

我认为在你的场景中,情况1是首选(因为2变得很无聊很快).

我会做这样的事情;首先创建一个自定义规范化器

<?PHP
namespace AppBundle; 

class DateTimeNormalizer extends SerializerAwareNormalizer implements NormalizerInterface,DenormalizerInterface
{
    /**
     * {@inheritdoc}
     */
    public function normalize($object,$format = null,array $context = array())
    {
        return $object->format(\DateTime::ISO8601);
    }

    /**
     * {@inheritdoc}
     */
    public function denormalize($data,$class,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');
    }
}

然后将其注册到您的服务:

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

相关文章

Hessian开源的远程通讯,采用二进制 RPC的协议,基于 HTTP 传输。可以实现PHP调用Java,Python,C#等多语...
初识Mongodb的一些总结,在Mac Os X下真实搭建mongodb环境,以及分享个Mongodb管理工具,学习期间一些总结...
边看边操作,这样才能记得牢,实践是检验真理的唯一标准.光看不练假把式,光练不看傻把式,边看边练真把式....
在php中,结果输出一共有两种方式:echo和print,下面将对两种方式做一个比较。 echo与print的区别: (...
在安装好wampServer后,一直没有使用phpMyAdmin,今天用了一下,phpMyAdmin显示错误:The mbstring exte...
变量是用于存储数据的容器,与代数相似,可以给变量赋予某个确定的值(例如:$x=3)或者是赋予其它的变...