2014-12-15 11 views
6

Ja próbuje użyć niestandardowego programu obsługi dla JMS Serializatora Bundleklienta Handler na JMSSerializerBundle jest ignorowany

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

To nic nie robi, a nie umierać. Oto, w jaki sposób rejestruję program obsługi: Mój program obsługi nigdy nie jest wywoływany i nie mogę manipulować danymi podczas serializacji.

+2

Czy kiedykolwiek to rozgryzłeś? Mam ten sam problem. 'getSubscribingMethods()' wydaje się być wywołany, ale nie 'serializeIntToJson' – Chris

+1

@Chris checkout moja nowa odpowiedź - chociaż odpowiedziałem na inne pytanie! Niedźwiedź ze mną .... –

+1

@ Chris, OK Wysłałem kolejną odpowiedź teraz. Mam nadzieję że to pomogło. –

Odpowiedz

2

mam ten, który działa

$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 to moja istota.

Można pominąć ten wiersz, jeśli nie masz configs serializer

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

myślę moim głównym problemem było to ->addDefaultListeners().

W config.yml mam

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

nie mam anthing utworzone, aby JMS usługą.

4

Trzeba utworzyć usługa dla tego Handler:

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

następnie upewnij się, że używasz zarejestrowanego usługę serializer JMS

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

Musiałem przedrostkiem jms_serializer do custom_jms_handler kiedy tworzenie usługi w services.yml. W ten sposób: 'jms_serializer.custom_jms_handler' – franbenz