Search code examples
symfonyserializationhandlerjmsserializerbundle

Custom Handler on JMSSerializerBundle is ignored


I am attempting to use a custom handler for 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");
    }
}

This does nothing, and does not die. This is how I am registering the handler

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

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

My handler is never called and I cannot manipulate the data on serialisation.


Solution

  • I have this which works

        $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 is my entity.

    You can omit this line if you don't have serializer configs

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

    I think my main issue was this ->addDefaultListeners().

    In config.yml I have

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

    I don't have anthing set up to make JMS a service.