2014-12-15 7 views
6
ignoriert

Ich versuche, einen benutzerdefinierten Handler für JMS Serializer BundleBenutzerdefinierte Handler auf JMSSerializerBundle wird

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"); 
    } 
} 

Dies tut nichts zu verwenden, und nicht stirbt. So registriere ich den Handler

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

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

Mein Handler wird nie aufgerufen und ich kann die Serialisierungsdaten nicht manipulieren.

+2

Haben Sie das jemals herausgefunden? Ich habe das gleiche Problem. 'getSubscribingMethods()' scheint aufgerufen zu werden, aber nicht 'serializeIntToJson' – Chris

+1

@Chris checkout meine neue Antwort - obwohl ich eine andere Frage beantwortet habe! Bär mit mir .... –

+1

@Chris, OK Ich habe jetzt eine andere Antwort gepostet. Ich hoffe das hilft. –

Antwort

2

Ich habe dies die

$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'); 

arbeitet $project ist meine Entität.

können Sie diese Zeile weglassen, wenn Sie Serializer configs nicht

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

ich mein Hauptproblem dieses ->addDefaultListeners() war denken.

In config.yml Ich habe

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

Ich habe keine anthing einrichten ein Service in Anspruch nehmen JMS.

4

Sie benötigen einen Service für diesen Handler zu erstellen:

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

Dann stellen Sie sicher, den registrierten JMS Serializer-Dienst verwenden

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

Ich musste jms_serializer dem custom_jms_handler voranstellen, wenn Erstellen des Dienstes in services.yml. So: 'jms_serializer.custom_jms_handler' – franbenz