wsdltophp / packagebase
包含由 wsdltophp/packagegenerator 生成的类所使用的基类
Requires (Dev)
- friendsofphp/php-cs-fixer: ~3.0
- phpstan/phpstan: ^1.4
- phpunit/phpunit: ^9
- dev-develop
- 5.0.4
- 5.0.3
- 5.0.2
- 5.0.1
- 5.0.0
- 4.x-dev
- 4.0.1
- 4.0.0
- 3.x-dev
- 3.0.2
- 3.0.1
- 3.0.0
- 2.x-dev
- 2.2.3
- 2.2.2
- 2.2.1
- 2.2.0
- 2.1.0
- 2.0.3
- 2.0.2
- 2.0.1
- 2.0.0
- 1.1.0
- 1.0.15
- 1.0.14
- 1.0.13
- 1.0.12
- 1.0.11
- 1.0.10
- 1.0.9
- 1.0.8
- 1.0.7
- 1.0.6
- 1.0.5
- 1.0.4
- 1.0.3
- 1.0.2
- 1.0.1
- 1.0.0
- 1.0.0rc02
- 1.0.0rc01
- 0.0.3
- 0.0.2
- 0.0.1
- dev-master
- dev-feature/ntlm-soap-client
This package is auto-updated.
Last update: 2024-09-05 23:22:53 UTC
README
由 PackageGenerator 项目生成的类所使用的类,用于简化 SoapClient UX。
目标是提供在 PackageGenerator 项目生成的类之上的通用且有用的类。
例如,它允许轻松遍历 SOAP 结果对象属性数组的元素,它允许轻松设置 SOAP 请求的 HTTP 和 SOAP 头部,它允许轻松从其数组状态表示形式填充对象。
主要功能
接口
必须使用定义的接口,以便能够满足 PackageGenerator 生成的类的需求。
StructEnumInterface
描述
必须使用此接口来定义一个新的 EnumType 类。
需要实现什么?
至少有一个方法必须实现,所以即使你不清楚其目的,实现起来也很简单
- valueIsValid($value): 此方法必须确保传入的
$value
是有效的。这可以通过使用始终存在于生成的 Enum 类中的getValidValues
方法返回的字符串数组来完成。
如果您不想实现此方法,也可以创建自己的类,该类继承自我们的 AbstractStructEnumBase 类。
StructInterface
描述
必须使用此接口来定义一个新的 StructType 类。
需要实现什么?
至少有一个方法必须实现,所以即使你不清楚其目的,实现起来也很简单
- __set_state: __set_state 在您想加载使用 var_export 存储为字符串的对象时很有用。
如果您不想实现此方法,也可以创建自己的类,该类继承自我们的 AbstractStructBase 类。
StructArrayInterface
描述
必须使用此接口来定义一个新的 ArrayType 类。目标是提供围绕由 Wsdl 定义的 Array Structs 的实用方法,以简化其内容处理。因此,此接口继承自我们的 StructInterface 接口以及原生的 ArrayAccess、Iterator 和 Countable 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_NONE
、WSDL_CACHE_DISK
、WSDL_CACHE_MEMORY
或WSDL_CACHE_BOTH
- WSDL_STREAM_CONTEXT:用于context的resource
- WSDL_SOAP_VERSION:一个是
SOAP_1_1
或SOAP_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_ARRAYS
、SOAP_USE_XSI_ARRAY_TYPE
、SOAP_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_TLS
、SOAP_SSL_METHOD_SSLv2
、SOAP_SSL_METHOD_SSLv3
或SOAP_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
- **您可以使用
count
,length
方法:为您提供包含在您的对象中的项目数量 - 您可以遍历项目
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)。请参阅许可证文件获取更多信息。