php-soap/encoding

SOAP 编码和解码包

0.11.0 2024-09-03 14:34 UTC

This package is auto-updated.

Last update: 2024-09-03 14:34:54 UTC


README

此包提供了一个纯PHP的ext-soap编码逻辑的替代方案。它可以作为一个驱动程序,这样您就不再需要在您的机器上安装PHP的soap扩展了。

感谢

此项目得到了buhta.com的赞助。

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 对象上调用 fromto 时,数据应该是相同的。有关此概念的信息,请参阅此处

有关可用编码器的完整列表,您可以在Soap\Encoding\Encoder命名空间中查看。在examples/encoders目录中也有一些使用这些编码器解决常见问题的示例。