JMS 序列化任何不同的属性

问题描述 投票:0回答:1

我需要像这样通过 XML 使用一些第三方 API

  <App:Envelope xmlns:App="http://somenamespace.com/version/1_0">
   <Head/>
   <Body>
     <AppData>
       <method:Auth xmlns:method="http://somenamespace/method/1_0">
          <Login>MyUserName</Login>
          <Password>123456</Password>
       </method:Auth>
     </AppData>
   </Body>
</App:Envelope>

我使用 goetas xsd2php 为 JMS Serializer 生成类和元数据

这工作正常,但我的 AppData 类根据请求类型有不同的类型,我不知道如何序列化它。我得到了带有空 AppData 部分的 XML

信封.php

class Envelope
{
    private $header = null;
    private $body = null;
    public function getHeader()
    {
        return $this->header;
    }
    public function setHeader(\HeaderCType $header)
    {
        $this->header = $header;
        return $this;
    }
    public function getBody()
    {
        return $this->body;
    }
    public function setBody(\BodyCType $body)
    {
        $this->body = $body;
        return $this;
    }
    public function __construct()
    {
        $this->body = new BodyCType();
        $this->header = new HeaderCType();
    }

    public function createAuth($login, $password){
        $app = new AppDataType();
        $app->setAuth(new Auth($login, $password));
        $this->body->setAppData($app);
    }           
}

AppDataType.php

  class AppDataType
    {

    }

我尝试使用 goetas xsd2php 示例中的任何类型的订阅处理程序,但无法理解如何序列化 Auth 部分?任何人都可以给我一个真实的代码示例,我该怎么做?

php xml serialization xsd
1个回答
0
投票

解决了一个问题

public function serializeAnyType(XmlSerializationVisitor $visitor, $data, array $type, Context $context)
{

    foreach ($data as $key => $value) {

        $assestor = new \JMS\Serializer\Accessor\DefaultAccessorStrategy();
        $metadata = $context->getMetadataFactory()->getMetadataForClass(get_class($value));
        $visitor->getCurrentNode()->appendChild($visitor->createRoot($metadata));
        foreach ($metadata->propertyMetadata as $property) {
            $val = $assestor->getValue($data->{$key}, $property, $context);
            $visitor->visitProperty($property, $val);
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.