php-soap / encoding
SOAP 编码和解码包
0.11.0
2024-09-03 14:34 UTC
Requires
- php: ~8.1.0 || ~8.2.0 || ~8.3.0
- azjezz/psl: ^2.9.0
- php-soap/engine: ^2.9
- php-soap/wsdl: ^1.6
- php-soap/wsdl-reader: ~0.15
- php-soap/xml: ^1.7
- veewee/reflecta: ~0.6
- veewee/xml: ^3.1
Requires (Dev)
- guzzlehttp/guzzle: ^7.8
- php-soap/engine-integration-tests: ^1.8.1
- php-soap/psr18-transport: ^1.6
- php-standard-library/psalm-plugin: ^2.3
- phpunit/phpunit: ^10.5
- symfony/var-dumper: ^7.0 || ^6.4
- vimeo/psalm: ^5.16
README
此包提供了一个纯PHP的ext-soap
编码逻辑的替代方案。它可以作为一个驱动程序,这样您就不再需要在您的机器上安装PHP的soap扩展了。
感谢
此项目得到了buhta.com的赞助。
想要帮忙吗?💚
想要了解更多关于此项目未来的信息?查看我们将要着手进行的下一个大型项目列表。
安装
composer require php-soap/encoding
示例用法
use Soap\Encoding\Driver; use Soap\Encoding\EncoderRegistry; use Soap\Engine\SimpleEngine; use Soap\Psr18Transport\Psr18Transport; use Soap\Wsdl\Loader\StreamWrapperLoader; use Soap\WsdlReader\Locator\ServiceSelectionCriteria; use Soap\WsdlReader\Model\Definitions\SoapVersion; use Soap\WsdlReader\Wsdl1Reader; // Loads the WSDL with the php-soap/wsdl-reader package: $wsdl = (new Wsdl1Reader(new StreamWrapperLoader()))($wsdlLocation); // Create an engine based on the encoding system that is provided by this package: $engine = new SimpleEngine( Driver::createFromWsdl1( $wsdl, ServiceSelectionCriteria::defaults() ->withPreferredSoapVersion(SoapVersion::SOAP_12), EncoderRegistry::default(), ), Psr18Transport::createForClient($httpClient) ); // Perform requests: $decodedResult = $engine->request('Add', [ [ 'a' => 1, 'b' => 2 ] ]); /* RESULT : class stdClass#2135 (1) { public $AddResult => int(3) } */
EncoderRegistry
EncoderRegistry
是一组可以用于编码和解码数据的编码器。默认情况下,我们提供了一组广泛的编码器来执行基本的 SOAP 编码逻辑。然而,您可以通过向注册表中添加自己的编码器来配置如何进行编码。
一些示例
use Soap\Encoding\ClassMap\ClassMap; use Soap\Encoding\ClassMap\ClassMapCollection; use Soap\Encoding\Encoder\SimpleType\DateTimeTypeEncoder; use Soap\Encoding\EncoderRegistry; use Soap\Xml\Xmlns; EncoderRegistry::default() ->addClassMap('urn:namespace', 'TypeA', TypeA::class) ->addClassMap('urn:namespace', 'TypeB', TypeB::class) ->addClassMapCollection(new ClassMapCollection( new ClassMap('urn:namespace', 'TypeC', TypeC::class), )) ->addBackedEnum('urn:namespace', 'EnumA', EnumA::class) ->addSimpleTypeConverter(Xmlns::xsd()->value(), 'dateTime', new DateTimeTypeEncoder('Y-m-d\TH:i:s')) ->addComplexTypeConverter('urn:namespace', 'TypeC', MySpecificTypeCEncoder::class);
编码器
编码和解码基于小的 XmlEncoder
类,这些类负责编码和解码特定类型的数据。您可以使用提供的编码器之一,也可以创建自己的。
构建自定义编码器的示例
use Soap\Encoding\Encoder\Context; use Soap\Encoding\Encoder\XmlEncoder; use VeeWee\Reflecta\Iso\Iso; /** * @implements XmlEncoder<MyClass, string> */ class MySpecificTypeCEncoder implements XmlEncoder { /** * @return Iso<MyClass, string> */ public function iso(Context $context) : Iso { return new Iso( to: static fn (MyClass $value): string => $myClass->toXmlString(), from: static fn (string $value) => MyClass::fromXmlString($value), ); } }
注意:编码器被认为是同构的:当在 Iso
对象上调用 from
和 to
时,数据应该是相同的。有关此概念的信息,请参阅此处。
有关可用编码器的完整列表,您可以在Soap\Encoding\Encoder命名空间中查看。在examples/encoders目录中也有一些使用这些编码器解决常见问题的示例。