Я пишу проект оболочки PHP для API. В моем объекте ответа я люблю десериализовать блок JSON для объекта. Это не стандартный фреймворк Symfony, а проект PHP с компонентами Symfony.
В рамках проекта Symfony я бы просто позвонил
$serializer = $this->get('serializer');
и покончим с этим. Но, конечно, мой класс не является ContainerAware и не имеет никакого доступа к контейнеру или сервисам в целом. Мне нужно использовать JMS Serializer в качестве API, для которого я пишу оболочку, также используется JMS Serializer (с настройками).
Есть ли способ инициализировать сериализатор JMS (JMS\Serializer\Serializer
) вручную?
В services.xml Сериализатора JMS есть следующее определение:
<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>
...
Я мог бы инициализировать один объект за другим, но все равно застрял бы в точке, где находится контейнер службы (<argument type="service" id="service_container" />
) необходимо.
Есть ли еще способ инициализировать JMS Serializer вручную?
Файл сервисов, который вы просматриваете, взят из JMSSerializerBundle, специфичной для платформы Symfony 2.
Сам пакет является лишь тонкой оболочкой для универсального кода пакета сериализатора JMS.
Документация пакета поможет вам: https://github.com/schmittjoh/serializer/tree/master/doc
Строительную часть можно найти здесь:
https://github.com/schmittjoh/serializer/blob/master/doc/configuration.rst
Других решений пока нет …