You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JMS Serializer多类型AppDataType序列化实现求代码示例

解决goetas xsd2php生成的AppDataType序列化空节点问题

问题出在自动生成的AppDataType类没有承载动态请求数据的属性,导致序列化时AppData节点为空。下面是可运行的完整解决方案:

1. 修改AppDataType类

给空的AppDataType添加属性来存储动态内容,比如任意类型的$content:

class AppDataType
{
    /**
     * @var mixed
     */
    private $content;

    public function getContent()
    {
        return $this->content;
    }

    public function setContent($content): void
    {
        $this->content = $content;
    }
}

2. 配置JMS序列化元数据

创建AppDataType.yml元数据文件(放在你的序列化元数据目录下),指定content字段用anyType处理器,并直接作为AppData的子节点:

App\YourNamespace\AppDataType:
    properties:
        content:
            expose: true
            type: 'anyType'
            serialized_name: '#'
            xml_element:
                namespace: ''

如果用XML格式的元数据,对应内容如下:

<serializer xmlns="http://jmsyst.com/schema/serializer-metadata">
    <class name="App\YourNamespace\AppDataType">
        <property name="content" expose="true" type="anyType">
            <serialized-name>#</serialized-name>
            <xml-element namespace="" />
        </property>
    </class>
</serializer>

3. 调整Envelope的createAuth方法

修改createAuth,将Auth对象赋值给AppDataType的content属性:

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

4. 完整序列化代码示例

注册Goetas的处理器并执行序列化,确保命名空间正确映射:

use JMS\Serializer\SerializerBuilder;
use GoetasWebservices\Xsd\XsdToPhpRuntime\Jms\Handler\BaseTypesHandler;
use GoetasWebservices\Xsd\XsdToPhpRuntime\Jms\Handler\XmlSchemaDateHandler;
use GoetasWebservices\Xsd\XsdToPhpRuntime\Jms\Handler\AnyTypeHandler;

// 构建序列化器
$serializer = SerializerBuilder::create()
    ->addMetadataDir(__DIR__ . '/your/metadata/dir', 'App\YourNamespace') // 替换为你的元数据目录
    ->configureHandlers(function ($handlerRegistry) {
        $handlerRegistry->registerSubscribingHandler(new BaseTypesHandler());
        $handlerRegistry->registerSubscribingHandler(new XmlSchemaDateHandler());
        $handlerRegistry->registerSubscribingHandler(new AnyTypeHandler());
    })
    ->build();

// 构造请求对象
$envelope = new Envelope();
$envelope->createAuth('MyUserName', '123456');

// 设置XML序列化上下文,指定命名空间
$context = $serializer->createSerializationContext();
$context->setXmlRootName(['Envelope', 'http://somenamespace.com/version/1_0']);
$context->setXmlNs([
    'App' => 'http://somenamespace.com/version/1_0',
    'method' => 'http://somenamespace/method/1_0'
]);

// 生成XML
$xml = $serializer->serialize($envelope, 'xml', $context);
echo $xml;

5. 确保Auth类元数据正确

检查Auth类的元数据(比如Auth.yml),确认命名空间和节点名称配置正确:

App\YourNamespace\Auth:
    xml_root_name: 'Auth'
    xml_root_namespace: 'http://somenamespace/method/1_0'
    properties:
        login:
            expose: true
            serialized_name: 'Login'
            type: string
        password:
            expose: true
            serialized_name: 'Password'
            type: string

执行以上代码后,就能生成符合目标格式的XML,AppData节点会正确包含带有method命名空间的Auth子节点。

内容的提问来源于stack exchange,提问作者Viktor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 21:55:57