2014-12-15 30 views
6

Sto tentando di usare un gestore personalizzato per JMS Serializer Bundlegestore personalizzato su JMSSerializerBundle viene ignorato

class CustomHandler implements SubscribingHandlerInterface 
{ 
    public static function getSubscribingMethods() 
    { 
     return array(
      array(
       'direction' => GraphNavigator::DIRECTION_SERIALIZATION, 
       'format' => 'json', 
       'type' => 'integer', 
       'method' => 'serializeIntToJson', 
      ), 
     ); 
    } 

    public function serializeIntToJson(JsonSerializationVisitor $visitor, $int, array $type, Context $context) 
    { 
     die("GIVE ME SOMETHING"); 
    } 
} 

Questo non fa nulla, e non muore. Questo è come sto registrando il gestore

$serializer = SerializerBuilder::create() 
    ->configureHandlers(function(HandlerRegistry $registry) { 
     $registry->registerSubscribingHandler(new MyHandler()); 
    }) 
    ->addDefaultHandlers() 
    ->build(); 

$json = $serializer->serialize($obj, 'json'); 

mio gestore non viene mai chiamato e non riesco a manipolare i dati di serializzazione.

+2

Lo hai mai capito? Sto avendo lo stesso problema. 'getSubscribingMethods()' sembra essere chiamato ma non 'serializeIntToJson' – Chris

+1

@Chris checkout la mia nuova risposta - anche se ho risposto a una domanda diversa! Portami con me .... –

+1

@Chris, OK Ho pubblicato un'altra risposta ora. Spero che aiuti. –

risposta

2

ho questo che funziona

$serializer = SerializerBuilder::create() 
     ->configureListeners(function(EventDispatcher $dispatcher) { 
      $dispatcher->addSubscriber(new ProjectSubscriber($this->container)); 
      $dispatcher->addSubscriber(new UserSubscriber($this->container)); 
     }) 
     ->addDefaultListeners() 
     ->addMetadataDir(realpath($this->get('kernel')->getRootDir()."/../") . '/src/Jake/NameOfBundle/Resources/config/serializer') 
     ->build(); 

    return $serializer->serialize($project, 'json'); 

$project è la mia entità.

è possibile omettere questa riga se non si dispone di file di configurazione serializzatore

->addMetadataDir(realpath($this->get('kernel')->getRootDir()."/../") . '/src/Jake/NameOfBundle/Resources/config/serializer') 

Penso che il mio problema principale era questo ->addDefaultListeners().

In config.yml ho

jms_serializer: 
    metadata: 
     auto_detection: true 
     directories: 
      NameOfBundle: 
       namespace_prefix: "" 
       path: "@JakeNameOfBundle/Resources/config/serializer" 

Non ho anthing impostato per renderlo un servizio JMS.

4

È necessario creare un servizio per questo gestore:

custom_jms_handler: 
    class: MyBundle\Serializer\CustomHandler 
    tags: 
     - { name: jms_serializer.subscribing_handler } 

Poi assicurarsi di utilizzare il servizio serializzatore JMS registrati

$json = $this->get('jms_serializer')->serialize($obj, 'json'); 
+0

Ho dovuto prefissare jms_serializer a custom_jms_handler quando creando il servizio in services.yml. In questo modo: 'jms_serializer.custom_jms_handler' – franbenz