2014-12-15 18 views
6

Tôi đang cố gắng sử dụng một trình xử lý tùy chỉnh cho JMS Serializer BundleTuỳ chỉnh Handler trên JMSSerializerBundle bị bỏ qua

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

này không có gì, và không chết. Đây là cách tôi đang đăng ký xử lý

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

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

xử lý của tôi là không bao giờ gọi và tôi không thể thao tác dữ liệu trên serialization.

+2

Bạn đã bao giờ tìm ra điều này chưa? Tôi đang gặp vấn đề tương tự. 'getSubscribingMethods()' dường như được gọi nhưng không phải 'serializeIntToJson' – Chris

+1

@Chris checkout câu trả lời mới của tôi - mặc dù tôi đã trả lời một câu hỏi khác! Chịu với tôi .... –

+1

@ Chris, OK Tôi đã đăng câu trả lời khác ngay bây giờ. Tôi hy vọng rằng sẽ giúp. –

Trả lời

2

Tôi có điều này mà làm việc

$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 là thực thể của tôi.

Bạn có thể bỏ qua dòng này nếu bạn không có configs serializer

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

Tôi nghĩ vấn đề chính của tôi là ->addDefaultListeners() này.

Trong config.yml Tôi có

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

Tôi không có anthing thiết lập để làm JMS một dịch vụ.

4

Bạn cần phải tạo một dịch vụ cho xử lý này:

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

Sau đó, chắc chắn rằng bạn sử dụng dịch vụ serializer đăng ký JMS

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

Tôi phải đặt tiền tố jms_serializer vào custom_jms_handler khi tạo dịch vụ trong services.yml. Như thế này: 'jms_serializer.custom_jms_handler' – franbenz