如何管理JMS Serializer序列化规则

时间:2018-01-05 13:15:10

标签: php xml serialization xsd jms-serializer

我正在使用xsd2php库来解析描述API请求体的XSD。然后使用相同的库(它本身使用jsm-serializer)我尝试序列化对象:

$payload = new TrackRequest;

$searchCriteria = new SearchCriteriaAType;
$searchCriteria->addToConsignmentNumber(11111);
$payload->setSearchCriteria($searchCriteria);

$levelOfDetail = new LevelOfDetailAType;
$levelOfDetail->setSummary(true);
$payload->setLevelOfDetail($levelOfDetail);

使用基本的序列化设置:

$serializerBuilder = SerializerBuilder::create();
$serializerBuilder->addMetadataDir(__DIR__ . '/../../metadata/Tracking', 'TNTExpressConnect\Tracking\XSD');
$serializerBuilder->setPropertyNamingStrategy(new IdenticalPropertyNamingStrategy);
$serializerBuilder->configureHandlers(function (HandlerRegistryInterface $handler) use ($serializerBuilder) {
    $serializerBuilder->addDefaultHandlers();
    $handler->registerSubscribingHandler(new BaseTypesHandler()); // XMLSchema List handling
    $handler->registerSubscribingHandler(new XmlSchemaDateHandler()); // XMLSchema date handling
});

序列化导致:

<?xml version="1.0" encoding="UTF-8"?>
<result>
  <searchCriteria>
    <account/>
    <alternativeConsignmentNumber/>
    <consignmentNumber>
      <entry><![CDATA[11111]]></entry>
    </consignmentNumber>
    <customerReference/>
    <pieceReference/>
  </searchCriteria>
  <levelOfDetail>
    <summary>true</summary>
  </levelOfDetail>
</result>

关于这个结果,我有几个问题:

  1. 为什么根元素是<result>而不是<TrackRequest>
  2. 如何摆脱CDATA
  3. 如何摆脱<entry>代码,转而为每个条目创建单独的consigmentNumber代码?
  4. 如何使用自动结束标记<summary>true</summary>
  5. 替换<summary/>

    我想对于每一种情况我都可以创建一个专用的handler,但也许有一个内置的解决方案,我在文档中忽略了(可能有些配置选项可以放在yaml中)

    如果我必须创建处理程序,也许有人可以指出更复杂的例子,这解释了如何正确地做到这一点。

    我不是注释的忠实粉丝,所以我更喜欢使用单独的配置文件。

    提前谢谢。

1 个答案:

答案 0 :(得分:1)

你应该看看YAML Reference。可以使用元数据文件设置很多东西。

  1. 更改&#34;结果&#34; to&#34; TrackRequest&#34;将此行添加到文件中:

    Vendor\MyBundle\Model\ClassName:
        xml_root_name: TrackRequest ## Changes the root element
    
  2. 要删除条目中的cdata,请更改属性:

    properties:
    entry:
        xml_element:
            cdata: false ## Add this to disable cdata tags
    
  3. 刚遇到与你一样的问题。我希望它有所帮助。