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
相关产品推荐
相关产品推荐

