JMSSerializerBundle上的自定义处理程序将被忽略

Jak*_*e N 8 serialization handler symfony jmsserializerbundle

我正在尝试为JMS Serializer Bundle使用自定义处理程序

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");
    }
}
Run Code Online (Sandbox Code Playgroud)

这什么都不做,也不会死.这就是我注册处理程序的方式

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

$json = $serializer->serialize($obj, 'json');
Run Code Online (Sandbox Code Playgroud)

我的处理程序从未被调用过,我无法操纵序列化数据.

Jas*_*man 5

您需要为此处理程序创建服务:

custom_jms_handler:
    class: MyBundle\Serializer\CustomHandler
    tags:
        - { name: jms_serializer.subscribing_handler }
Run Code Online (Sandbox Code Playgroud)

然后确保使用注册的JMS序列化程序服务

$json = $this->get('jms_serializer')->serialize($obj, 'json');
Run Code Online (Sandbox Code Playgroud)


Jak*_*e N 1

我有这个有效

    $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');
Run Code Online (Sandbox Code Playgroud)

$project是我的实体。

如果您没有序列化器配置,则可以省略此行

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

我想我的主要问题是这个->addDefaultListeners()

config.yml我有

jms_serializer:
    metadata:
        auto_detection: true
        directories:
            NameOfBundle:
                namespace_prefix: ""
                path: "@JakeNameOfBundle/Resources/config/serializer"
Run Code Online (Sandbox Code Playgroud)

我没有设置任何东西来使 JMS 成为一项服务。