Versionen

Inhaltsverzeichnis

Support

Sie können Support über die Symfony2 mailing list erhalten.

Falls Sie einen Bug gefunden haben, öffnen Sie bitte ein neues Ticket im Bug-Tracker.


Benötigen Sie einen Experten?

Nutzen Sie das Wissen und die Expertise eines Symfony2 Experten direkt vor Ort.
http://jmsyst.com/unterstuetzung

GitHub

Custom De-/Serialization Handlers

Introduction

This allows you to change the way of how a specifc type is being de-/serialized.

Any handler must implement either the SerializationHandlerInterface, or DeserializationHandlerInterface, or both. This bundle already comes with some handlers which you find in the Serializer/Handler folder, and which you can use as a starting point.

Custom handlers are normal services, and thus can have dependencies on any other service available in the dependency injection container.

Configuration

After you have written your handler, you can write a service definition. Such as the following:

<service id="acme_foo.serializer.my_handler"
         class="Acme\FooBundle\Serializer\MyHandler"
         public="false"
         />

The Handler Factory

What is left to do is to publish our new handler to this bundle. So it gets picked up, and wired correctly. In order to do this, this bundle uses a configuration system similar to that of the SecurityBundle. Each handler needs a corresponding definition factory:

<?php

namespace Acme\FooBundle\DependencyInjection\Factory;

use JMS\SerializerBundle\DependencyInjection\HandlerFactoryInterface;

class MyHandlerFactory implements HandlerFactoryInterface
{
    public function getConfigKey()
    {
        return 'acme_foo_my';
    }

    public function getType(array $config)
    {
        return self::TYPE_SERIALIZATION | self::TYPE_DESERIALIZATION;
    }

    public function addConfiguration(ArrayNodeDefinition $builder)
    {
        $builder
            ->children()
                ->scalarNode('foo')->end()
                ->scalarNode('bar')->end()
            ->end()
        ;
    }

    public function getHandlerId(ContainerBuilder $container, array $config)
    {
        return 'acme_foo.serializer.my_handler';
    }
}

This factory is responsible for setting up the configuration for your handler in the addConfiguration method, and then process that configuration in the getHandlerId method.

The last thing left to do, is to add this factory to this bundle. This is done by adding a configureSerializerExtension to your bundle class:

<?php

namespace Acme\FooBundle;

use Acme\FooBundle\DependencyInjection\Factory\FooFactory;
use JMS\SerializerBundle\DependencyInjection\JMSSerializerExtension;
use Symfony\Component\HttpKernel\Bundle\Bundle;

class AcmeFooBundle extends Bundle
{
    public function configureSerializerExtension(JMSSerializerExtension $ext)
    {
        $ext->addHandlerFactory(new FooFactory());
    }
}

Enabling Your Handler

TODO: Add example config

Tip: The order in which the handlers are listed in the “handlers” section defines in which they are called while processing.