dmt-software / jms-soap-serializer
JMS 序列化访问者,用于(反)序列化 SOAP 请求/响应
v2.3.0
2024-02-27 15:24 UTC
Requires
- php: >=7.2
- ext-dom: *
- ext-intl: *
- ext-simplexml: *
- doctrine/annotations: ^2.0
- jms/serializer: ^3.19
Requires (Dev)
- ext-soap: *
- phpunit/phpunit: ^7.2 || ^8.0
README
安装
composer require dmt-software/jms-soap-serializer
使用方法
配置序列化器
use DMT\Soap\Serializer\SoapDeserializationVisitorFactory; use DMT\Soap\Serializer\SoapSerializationVisitorFactory; use DMT\Soap\Serializer\SoapMessageEventSubscriber; use JMS\Serializer\EventDispatcher\EventDispatcher; use JMS\Serializer\SerializerBuilder; $builder = SerializerBuilder::create() ->setSerializationVisitor('soap', new SoapSerializationVisitorFactory()) ->setDeserializationVisitor('soap', new SoapDeserializationVisitorFactory()) ->configureListeners( function (EventDispatcher $dispatcher) { $dispatcher->addSubscriber( new SoapMessageEventSubscriber() ); } ); $serializer = $builder->build();
启用 DateTime 对象的(反)序列化
use DMT\Soap\Serializer\SoapDateHandler; use JMS\Serializer\Handler\HandlerRegistry; /** @var JMS\Serializer\SerializerBuilder $builder */ $builder->configureHandlers( function(HandlerRegistry $registry) { $registry->registerSubscribingHandler(new SoapDateHandler()); } );
使用 SoapHeader 配置序列化器
use DMT\Soap\Serializer\SoapHeaderInterface; use DMT\Soap\Serializer\SoapHeaderEventSubscriber; use DMT\Soap\Serializer\SoapMessageEventSubscriber; use JMS\Serializer\EventDispatcher\EventDispatcher; /** @var JMS\Serializer\SerializerBuilder $builder */ $builder->configureListeners( function (EventDispatcher $dispatcher) { $dispatcher->addSubscriber( new SoapMessageEventSubscriber() ); /** @var SoapHeaderInterface $soapHeader */ $dispatcher->addSubscriber( new SoapHeaderEventSubscriber($soapHeader) ); } );
使用 SOAP 1.2
use DMT\Soap\Serializer\SoapNamespaceInterface; use DMT\Soap\Serializer\SoapSerializationVisitorFactory; /** @var JMS\Serializer\SerializerBuilder $builder */ $builder->setSerializationVisitor( 'soap', (new SoapSerializationVisitorFactory()) ->setSoapVersion(SoapNamespaceInterface::SOAP_1_2) );
使用序列化器
序列化 SOAP 请求
use JMS\Serializer\Serializer; /** @var Message $requestMessage */ /** @var Serializer $serializer */ $request = $serializer->serialize($requestMessage, 'soap'); // $request = '<soap:Envelope ...><soap:Body><ns1:Message>...</ns1:Message></soap:Body></soap:Envelope>';
反序列化 SOAP 响应
use JMS\Serializer\Serializer; /** @var Serializer $serializer */ $response = $serializer->deserialize('<env:Envelope ... </env:Envelope>', ResponseMessage::class, 'soap'); // $response instanceof ResponseMessage
调试
请求失败
在创建 SOAP 消息时,您必须提供 XmlRoot 和 XmlRootNamespace。如果您忘记提供它们,则会抛出异常
缺少 {{ YourSOAPRequest }} 的 XmlRootName 或 XmlRootNamespace。
要修复此问题,请将 XmlRoot 注解添加到您的配置中
namespace Any\NS; use JMS\Serializer\Annotation as JMS; /** * @JMS\XmlRoot("YourSOAPRequest", namespace="http://ns-for-your-request") */ class YourSOAPRequest { //... }
或者如果您正在使用 yaml 配置
Any\NS\YourSOAPRequest: ... xml_root_name: YourSOAPRequest xml_root_namespace: http://ns-for-your-request ...