我需要像这样通过 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 部分?任何人都可以给我一个真实的代码示例,我该怎么做?
解决了一个问题
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);
}
}
}