2017-09-06 30 views
1

我相信这是一个小错误,但我找不到它。 我正在尝试关注the official doc并在pre_serialize事件上实现事件侦听器。JMS串行器事件不起作用

我的服务宣言:

<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');不显示?

也许这是与事实,我的对象是一个学说实体(issue 666PR 677

回答

1

我终于发现了问题。问题是

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

这并不工作,但这样做:

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

太棒了!将您的答案标记为已接受,以便用户更好地找到解决方案 – Matteo

0

尝试添加类属性,作为例子的关系:

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

关于文档的另一个区别是在类的方法的论点:你应该使用PreSerializeEvent而不是ObjectEvent

所以像这样:

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

检查你的服务是正确地从集装箱为例与控制台命令:

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

希望这有助于

+0

我已经试过了,我试着用“格式” =>“JSON”太多,但它不工作:( – iBadGamer

+0

你可以尝试'onPostSerialize'方法来看看它是否有效 – Matteo

+0

我有四个事件链接到相同的功能(与死亡的那个),我的JSON仍然显示 – iBadGamer