wsdltophp/packagebase

包含由 wsdltophp/packagegenerator 生成的类所使用的基类

5.0.4 2024-02-05 22:04 UTC

README

PackageGenerator 项目生成的类所使用的类,用于简化 SoapClient UX。

License Latest Stable Version TeamCity build status Scrutinizer Code Quality Code Coverage Total Downloads StyleCI SymfonyInsight

目标是提供在 PackageGenerator 项目生成的类之上的通用且有用的类。

例如,它允许轻松遍历 SOAP 结果对象属性数组的元素,它允许轻松设置 SOAP 请求的 HTTP 和 SOAP 头部,它允许轻松从其数组状态表示形式填充对象。

主要功能

接口

必须使用定义的接口,以便能够满足 PackageGenerator 生成的类的需求。

StructEnumInterface

描述

必须使用此接口来定义一个新的 EnumType 类。

需要实现什么?

至少有一个方法必须实现,所以即使你不清楚其目的,实现起来也很简单

  • valueIsValid($value): 此方法必须确保传入的 $value 是有效的。这可以通过使用始终存在于生成的 Enum 类中的 getValidValues 方法返回的字符串数组来完成。

如果您不想实现此方法,也可以创建自己的类,该类继承自我们的 AbstractStructEnumBase 类。

StructInterface

描述

必须使用此接口来定义一个新的 StructType 类。

需要实现什么?

至少有一个方法必须实现,所以即使你不清楚其目的,实现起来也很简单

如果您不想实现此方法,也可以创建自己的类,该类继承自我们的 AbstractStructBase 类。

StructArrayInterface

描述

必须使用此接口来定义一个新的 ArrayType 类。目标是提供围绕由 Wsdl 定义的 Array Structs 的实用方法,以简化其内容处理。因此,此接口继承自我们的 StructInterface 接口以及原生的 ArrayAccessIteratorCountable PHP 接口

需要实现什么?

唯一必须实现的方法将是 getAttributeName,但请注意,它在每个生成的 ArrayType 类中都已实现,因此无需定义它。这只是一个关于 ArrayType 类中可用内容的提醒。

因此,基本上,你必须至少重写从该接口继承的PHP接口中声明的所有方法

如果你不想实现所有的方法,你也可以创建一个继承自我们的AbstractStructArrayBase类的自己的类。

SoapClientInterface

描述

此接口必须用于定义任何由PackageGenerator生成的ServiceType类的新的SoapClient基类。

选项

以下是此接口定义的常量/选项及其用途

  • DEFAULT_SOAP_CLIENT_CLASS = '\SoapClient':这是用于发送请求的默认SoapClient类。如果您想使用另一个SoapClient类,可以随意重写它
  • OPTION_PREFIX:这是任何常量选项名称的前缀
  • WSDL_URL:用于传递WSDL URL的选项索引
  • WSDL_URI:用于传递SOAP服务的目标名称空间的选项索引(对于非WSDL模式与location一起使用时是必需的)
  • WSDL_USE:用于传递非WSDL模式选项使用的选项索引
  • WSDL_STYLE:用于传递非WSDL模式选项样式的选项索引
  • WSDL_CLASSMAP:类映射数组
  • WSDL_LOGIN:基本认证的登录名
  • WSDL_PASSWORD:基本认证的密码
  • WSDL_TRACE:请求的跟踪,以便可以回溯错误。默认为true
  • WSDL_EXCEPTIONS:布尔值,定义是否将soap错误抛出为SoapFault类型的异常
  • WSDL_CACHE_WSDL:选项之一WSDL_CACHE_NONEWSDL_CACHE_DISKWSDL_CACHE_MEMORYWSDL_CACHE_BOTH
  • WSDL_STREAM_CONTEXT:用于contextresource
  • WSDL_SOAP_VERSION:一个是SOAP_1_1SOAP_1_2,分别选择SOAP 1.1或1.2。如果省略,则使用SOAP 1.1
  • WSDL_COMPRESSION:允许使用HTTP SOAP请求和响应的压缩
  • WSDL_ENCODING:内部字符编码。此选项不会更改SOAP请求的编码(总是utf-8),但将字符串转换为它
  • WSDL_CONNECTION_TIMEOUT:定义连接到SOAP服务的时间(秒)。此选项不会定义对响应缓慢的服务的时间限制。要限制调用完成等待的时间,可以使用default_socket_timeout设置
  • WSDL_TYPEMAP:类型映射数组。类型映射是一个键为type_name、type_ns(命名空间URI)、from_xml(接受一个字符串参数的回调)和to_xml(接受一个对象参数的回调)的数组
  • WSDL_USER_AGENT:指定用于User-Agent头部的字符串
  • WSDL_FEATURES:是SOAP_SINGLE_ELEMENT_ARRAYSSOAP_USE_XSI_ARRAY_TYPESOAP_WAIT_ONE_WAY_CALLS的位掩码
  • WSDL_KEEP_ALIVE:布尔值,定义是否发送Connection: Keep-Alive头或Connection: close
  • WSDL_PROXY_HOST:您的代理主机名
  • WSDL_PROXY_PORT:您的代理端口
  • WSDL_PROXY_LOGIN:您的代理登录名
  • WSDL_PROXY_PASSWORD:您的代理密码
  • WSDL_LOCAL_CERT:您的本地证书内容(作为字符串)
  • WSDL_PASSPHRASE:您的本地密码短语内容(作为字符串)
  • WSDL_AUTHENTICATION:认证方法可以是SOAP_AUTHENTICATION_BASIC(默认)或SOAP_AUTHENTICATION_DIGEST
  • WSDL_SSL_METHOD:是SOAP_SSL_METHOD_TLSSOAP_SSL_METHOD_SSLv2SOAP_SSL_METHOD_SSLv3SOAP_SSL_METHOD_SSLv23之一

需要实现什么?

以下是必须实现的方法及其原因

  • __construct(array $wsdlOptions = array(), $resetSoapClient = true):构造函数必须能够处理上述列出的其中一个常量
  • getSoapClient():必须返回负责发送请求的SoapClient对象。
  • setSoapHeader($nameSpace, $name, $data, $mustUnderstand = false, $actor = null):请参阅AbstractSoapClientBase部分,该部分详细说明了此方法。基本上,它允许定义请求的SoapHeader
  • getLastError():必须返回最后一个错误,其格式由您决定。
  • saveLastError($methodName, \SoapFault $soapFault):请参阅AbstractSoapClientBase部分,该部分详细说明了此方法。基本上,它必须在请求失败时允许存储捕获到的SoapFault对象。
  • getResult():应返回Soap Web服务响应,具体由您决定。
  • setResult($result):必须接受任何参数类型,因为它应该接收Soap Web服务响应。

如果您不想实现所有这些方法,也可以创建一个继承自我们的AbstractSoapClientBase类的自定义类。

抽象类

AbstractStructEnumBase

描述

此类是PackageGenerator生成的任何EnumType类的基类。它实现了我们的StructEnumInterface接口。它定义了两种方法

  • valueIsValid($value):它定义了验证基于当前EnumType类通过getValidValues方法返回的常量的默认行为。
  • __toString():请参阅__toString定义

AbstractStructBase

描述

此类是PackageGenerator生成的任何StructType类的基类。它实现了我们的StructInterface接口。它定义了五种方法

  • __set_state($array):当您加载使用var_export存储的对象的字符串表示时很有用。它还允许您轻松实例化包含许多属性的对象,这些属性使用__construct方法难以实例化。您可以将__set_state视为一种注水方法。
  • setPropertyValue(string $name, $value):作为魔法方法__set,但由__set_state方法使用。此外,通过为用于SoapClient的类定义__set方法,使用类映射选项会破坏接收到的对象的正确注水。
  • getPropertyValue(string $name):作为魔法方法__get。由我们的AbstractStructArrayBase类使用。
  • jsonSerialize():通过实现\JsonSerializable接口,它实现了此方法,该方法允许将对象传递给json_encode方法,从而以数组的形式返回当前对象的属性。
  • __toString():请参阅__toString定义

用法

$item = \Api\StructType\Item::__set_state([
    'id' => 1,
    'name' => 'Entity #1',
    'label' => 'Entity #1',
    '_href' => 'http://www.entity.com',
]);
// $item is now an \Api\StructType\Item object

AbstractStructArrayBase

描述

此类是PackageGenerator生成的任何ArrayType类的基类。它实现了我们的StructArrayInterface接口。

用法

一旦您有一个元素是项目的数组,例如

$items = \Api\ArrayType\Items::__set_state([
    'items' => [
        \Api\StructType\Item::__set_state([
            'id' => 1,
            'name' => 'Entity #1',
            'label' => 'Entity #1',
            '_href' => 'http://www.entity-1.com',
        ]),
        \Api\StructType\Item::__set_state([
            'id' => 2,
            'name' => 'Entity #2',
            'label' => 'Entity #2',
            '_href' => 'http://www.entity-2.com',
        ]),
        \Api\StructType\Item::__set_state([
            'id' => 3,
            'name' => 'Entity #3',
            'label' => 'Entity #3',
            '_href' => 'http://www.entity-3.com',
        ]),
    ],
]);
// 'items' is the unique property of the object
// Its name is returned by the getAttributeName method
// defined in the generated \Api\ArrayType\Items class
  • **您可以使用countlength方法:为您提供包含在您的对象中的项目数量
  • 您可以遍历项目
foreach ($items as $item) {
    // $items->current() and $item is an \Api\StructType\Item object
    // $items->key() is the current index
}
  • 您可以获取第一个项目
$items->first();
  • 您可以获取最后一个项目
$items->last();
  • 您可以获取任何项目
$items->item($index);
  • 您可以添加一个新的项目
$items->add(\Api\StructType\Item::__set_state([
    'id' => 4,
    'name' => 'Entity #4',
    'label' => 'Entity #4',
    '_href' => 'http://www.entity-4.com',
]));

AbstractSoapClientBase

描述

这个类是任何由PackageGenerator生成的ServiceType类的基类。它的目标是通过对我们的SoapClientInterface接口进行实现,提供一些实用方法。它基本上是一个装饰器设计模式,因为该类将SoapClient对象作为一个静态属性,以便能够对其应用方法。它是一个静态属性,以便在多次调用之间实现单例(允许在调用之间自动发送cookie)。可以通过传递第二个参数为true来重置它。

用法

假设你有一个这样的生成ServiceType类的类型

namespace Api\ServiceType;
use \WsdlToPhp\PackageBase\AbstractSoapClientBase;
class ApiUpdate extends AbstractSoapClientBase
{
    public function UpdateBulkOrder(\Api\StructType\ApiUpdateBulkOrder $parameters)
    {
        try {
            $this->setResult($this->getSoapClient()->UpdateBulkOrder($parameters));
            return $this->getResult();
        } catch (\SoapFault $soapFault) {
            $this->saveLastError(__METHOD__, $soapFault);
            return false;
        }
    }
}

你可以这样做

use \WsdlToPhp\PackageBase\AbstractSoapClientBase;
$options = [
    AbstractSoapClientBase::WSDL_URL => '__WSDL_URL__',
    AbstractSoapClientBase::WSDL_CLASSMAP => \Api\ApiClassMap::classMap(),
];
// sets the first instance of SoapClient within  AbstractSoapClientBase
$update = new \Api\ServiceType\ApiUpdate($options);
// resets the SoapClient instance
$update = new \Api\ServiceType\ApiUpdate($options, true);

然后调用以下任何基本方法

  • getResult:返回实际响应的对象。该对象的类应该是生成的类
  • getLastRequest($asDomDocument = false):返回请求的XML字符串版本或DOMDocument版本
  • getLastResponse($asDomDocument = false):返回响应的XML字符串版本或DOMDocument版本
  • getLastRequestHeaders($asArray = false):返回HTTP请求的头部信息,以字符串形式或数组形式(每个HTTP头部都被解析)
  • getLastResponseHeaders($asArray = false):返回HTTP响应的头部信息,以字符串形式或数组形式
  • getLastError:当调用$this->saveLastError(__METHOD__, $soapFault)时,自动填充错误
  • getLastErrorForMethod($methodName):返回与调用方法相关联的错误。它应该返回一个SoapFault对象
$result = $update->UpdateBulkOrder(new \Api\StructType\ApiUpdateBulkOrder())
if ($result !== false) {
    echo "\nThis is the result as an object:" . print_r($update->getResult(), true);
    // Actually $result is the same data than $update->getResult()
} else {
    echo "\nThis is the XML request:" . $update->getLastRequest(false);
    echo "\nThese are the request's headers:" . $update->getLastRequestHeaders(false);
    echo "\nThis is the XML response:" . $update->getLastResponse(false);
    echo "\nThese are the response's headers:" . $update->getLastResponseHeaders(false);
    echo "\nThese are the last errors:" . print_r($update->getLastError(), true);
    echo "\nThis is the current error:" . print_r($update->getLastErrorForMethod('\Api\ServiceType\ApiUpdate::UpdateBulkOrder'), true);
}

你还有其他一些方法,例如

  • setSoapHeader($nameSpace, $name, $data, $mustUnderstand = false, $actor = null):它提供了一种重新定义SoapHeaders的方法
// A sample of its usage in the generated ServiceType class
public function setSoapHeaderCSPCHD(\Api\StructType\ApiCSPCHD $cSPCHD, $nameSpace = 'http://tempuri.org', $mustUnderstand = false, $actor = null)
{
    return $this->setSoapHeader($nameSpace, 'CSPCHD', $cSPCHD, $mustUnderstand, $actor);
}
  • setHttpHeader($headerName, $headerValue):一种轻松定义必须发送的自定义HTTP头的方法
  • setLocation($location):设置要使用的Web服务的位置
  • getStreamContext():返回由SoapClient类使用的创建的流上下文
  • getStreamContextOptions():返回由SoapClient类使用的创建的流上下文选项

这些类需要改进吗?

请随时创建一些pull请求。我们将研究它们,并在它们可以集成时通知你。

测试

你可以使用以下命令运行单元测试

$ cd /path/to/src/WsdlToPhp/PackageBase/
$ composer install
$ composer test

使用Docker进行测试

感谢phpfarm的Docker镜像phpfarm,你可以在任何PHP版本下使用cli本地运行测试

  • php-7.4

首先,你需要创建一个容器,你可以使用docker-compose通过在项目的根目录中运行以下命令来创建容器

$ docker-compose up -d --build

然后你将有一个名为package_base的容器,在其中你可以运行composer命令和php cli命令,例如

# install deps in container (using update ensure it does use the composer.lock file if there is any)
$ docker exec -it package_base php-7.4 /usr/bin/composer update
# run tests in container
$ docker exec -it package_base php-7.4 -dmemory_limit=-1 vendor/bin/phpunit

常见问题解答(FAQ)

如果你有任何问题,请随时创建一个issue

许可证

MIT许可证(MIT)。请参阅许可证文件获取更多信息。