2017-09-06 34 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