JMS Serializer事件不起作用

时间:2017-09-06 14:32:18

标签: symfony jmsserializerbundle jms-serializer

我确信这是一个小错误,但我找不到它。 我正在尝试关注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 666PR 677

的事实有关系

2 个答案:

答案 0 :(得分:4)

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

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

这不起作用,但确实如此:

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

答案 1 :(得分:0)

尝试添加class属性,例如:

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

关于doc的另一个不同之处在于类方法的参数:你应该使用PreSerializeEvent而不是ObjectEvent

所以这样:

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

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

  

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

希望这个帮助