1

我正在为 API 编写一个 PHP 包装器项目。在我的响应对象中,我喜欢将 JSON 块反序列化为对象。它不是一个 symfony 标准框架项目,只是一个带有 symfony 组件的 PHP 项目。

在一个 symfony 项目中,我会简单地调用

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

并完成它。但当然,我的班级既不是 ContainerAware,也没有任何对容器或服务的访问权限。我需要使用 JMS 序列化器作为我正在编写包装器的 API,还使用了 JMS 序列化器(带有配置)。

有没有办法JMS\Serializer\Serializer手动初始化 JMS 序列化器()?

在 JMS Serializer 的 services.xml 中有以下定义:

<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 序列化器吗?

4

1 回答 1

2

您正在查看的服务文件来自 Symfony 2 框架特定的 JMSSerializerBundle。

捆绑包本身只是通用 JMS 序列化程序包代码的精简包装器。

包文档将帮助您:https ://github.com/schmittjoh/serializer/tree/master/doc

构造部分可以在这里找到: https ://github.com/schmittjoh/serializer/blob/master/doc/configuration.rst

于 2014-10-10T14:55:18.683 回答