Search code examples
phpjsonsymfonydependency-injectionjms-serializer

Is there a way to initialize a JSM Serializer manually?


I'm writing a PHP wrapper project for an API. Within my response object, I like to deserialize a JSON block to an object. It is not a symfony standard framework project, just a PHP project with symfony components.

Within a symfony project I would simply call

$serializer = $this->get('serializer');

and be done with it. But of course my class is neither ContainerAware nor has any kind of access to a container or services in general. I need to use the JMS Serializer as the API I'm writing the wrapper for also used the JMS Serializer (with configurations).

Is there a way to initialize a JMS Serializer (JMS\Serializer\Serializer) manually?

Within the services.xml of the JMS Serializer there is the following definition:

<service id="jms_serializer.serializer" class="%jms_serializer.serializer.class%" public="false">
    <argument type="service" id="jms_serializer.metadata_factory" />
    <argument type="service" id="jms_serializer.handler_registry" />
    <argument type="service" id="jms_serializer.object_constructor" />
    <argument type="collection" /><!-- Serialization Visitors -->
    <argument type="collection" /><!-- Deserialization Visitors -->
    <argument type="service" id="jms_serializer.event_dispatcher" />
</service>

...

<service id="jms_serializer.metadata_factory" class="%jms_serializer.metadata.metadata_factory.class%" public="false">
    <argument type="service" id="jms_serializer.metadata.lazy_loading_driver" />
    <argument>Metadata\ClassHierarchyMetadata</argument>
    <argument />
    <call method="setCache">
        <argument type="service" id="jms_serializer.metadata.cache" on-invalid="ignore" />
    </call>
</service>

...

<service id="jms_serializer.metadata.lazy_loading_driver" class="%jms_serializer.metadata.lazy_loading_driver.class%" public="false">
    <argument type="service" id="service_container" />
    <argument>jms_serializer.metadata_driver</argument>
</service>

...

I could initialize one object after the other but I would still be stuck at the point where the Service Container (<argument type="service" id="service_container" />) is required.

Is there still a way to initialize the JMS Serializer manually?


Solution

  • The services file you are looking at comes from the Symfony 2 framework specific JMSSerializerBundle.

    The bundle itself is just a thin wrapper to the generic JMS serializer package code.

    The package documentation will get you going: https://github.com/schmittjoh/serializer/tree/master/doc

    The construction part can be found here: https://github.com/schmittjoh/serializer/blob/master/doc/configuration.rst