JMS 序列化程序事件不工作

JMS Serializer event is not working

我确定这是一个小错误,但我找不到它。 我正在尝试关注 the official doc 并在 pre_serialize 事件上实施事件侦听器。

我的服务声明:

 <service id="app.question_serializer_subscriber" class="AppBundle\Serializer\QuestionSerializerSubscriber">
     <tag name="jms_serializer.event_subscriber"/>
 </service>

我的订阅者:

<?php

namespace AppBundle\Serializer;

use JMS\Serializer\EventDispatcher\EventSubscriberInterface;
use JMS\Serializer\EventDispatcher\ObjectEvent;

class QuestionSerializerSubscriber implements EventSubscriberInterface
{
    public static function getSubscribedEvents()
    {
        return array(
            array(
                'event'  => 'serializer.pre_serialize',
                'method' => 'onPreSerialize',
            )
        );
    }

    public function onPreSerialize(ObjectEvent $event)
    {
        die('in event');
    }
}

我的控制器:

        $question   = $repo->findLastVersionByQuestionId((int) $questionId);
        $serializer = SerializerBuilder::create()->build();

        $context = new SerializationContext();
        return new JsonResponse(json_decode(
            $serializer->serialize(
                $question,
                'json',
                $context
            ),
            true
        ));

当我访问路由时,我的实体问题被序列化并显示,但为什么 die('in event'); 没有显示?

可能与我的对象是一个Doctrine实体有关(issue 666 or PR 677)

尝试添加 class 属性,例如:

public static function getSubscribedEvents()
{
    return array(
        array(
            'event'  => 'serializer.pre_serialize',
            'class'  => 'FQCN_class_name',
            'method' => 'onPreSerialize',
        )
    );
}

关于文档的另一个区别在于 class 方法的参数:您应该使用 PreSerializeEvent 而不是 ObjectEvent:

像这样:

public function onPreSerialize(PreSerializeEvent $event)
{
    // ...
}

检查您的服务是否从容器中正确加载,例如使用控制台命令:

php app/console debug:container --tag=jms_serializer.event_subscriber

希望对您有所帮助

我终于找到问题了。问题是

$serializer = SerializerBuilder::create()->build();

这不起作用,但它确实有效:

$serializer =  $this->get('jms_serializer');