dcarbone / soap-plus
PHP SoapClient包装类
Requires
- php: ^8.0
- ext-curl: *
- ext-libxml: *
- ext-simplexml: *
- ext-soap: *
- dcarbone/curl-plus: 3.0.*
Requires (Dev)
- phpunit/phpunit: ^8.0 || ^9.0
README
简而言之,这个类替换了PHP的SoapClient类所使用的内部查询机制。这个包装类的主要原因是使PHP应用程序能够消费NTLM认证的SharePoint SOAP服务。这不是一个数据映射器,它只是像正常的SoapClient一样返回数据,但所有的内部查询都由PHP CURL库处理。
安装
此库设计为与Composer一起使用
“需求”条目
{ "dcarbone/soap-plus": "2.1.*" }
构造函数
构造函数已被重载,以便允许使用一些新的酷炫功能。所有基本构造选项都是可用的。要查看内置可用选项的列表,请参阅此处https://php.ac.cn/manual/en/soapclient.soapclient.php。
附加选项
auth_type
- 基本
- ntlm
- 摘要
- 任何
- anysafe
- NULL / 未定义
这些直接相关到内置的CURLAUTH_XXX选项(见此处,搜索“CURLAUTH”)。这是完全可选的,并且仅当您也定义了“login”和“password”选项时才应设置。
如果您定义了一个远程WSDL,相同的参数也将用于WSDL检索以及查询。
user_agent
此属性是可选的,允许您在请求中定义自定义的用户代理头值。
debug
通过在您的配置数组中将“debug”=> true设置,每个查询和结果都将存储在一个内部数组中,可以通过getDebugQueries()和getDebugResults()方法访问。您还可以通过enableDebug()和disableDebug()启用/禁用调试。
关于调试的一句忠告。SOAP结果通常很大,这意味着您可能会消耗大量内存来保存内部数组中保存的字符串。我建议不要在开发/本地开发环境之外启用此功能。我还提供了一个resetDebugValue()方法,该方法将清空数组。
wsdl_cache_path
此选项允许您指定生成WSDL缓存文件的目录。如果没有传递此选项的值,将使用sys_get_temp_dir值。
查询
PHP的SoapClient期望结果通常是以数组形式。由于来自SharePoint世界,其中大多数文档都概述了如何以XML构造查询,这可能会有些繁琐。因此,我在这个库中提供了一种简单的XML -> 数组转换功能。例如
SharePoint列表GetListItems
以下是一个针对SharePoint Lists WSDL上的GetListItems操作的示例XML SOAP查询。
<GetListItems xmlns='http://schemas.microsoft.com/sharepoint/soap/'> <listName>My List Name</listName> <rowLimit>150</rowLimit> <query> <any> <Query xmlns=''> <Where> <And> <Eq> <FieldRef Name='Column1' /> <Value Type='Integer'>1</Value> </Eq> <And> <Neq> <FieldRef Name='Column3' /> <Value Type='Text'>value i don't want</Value> </Neq> <IsNotNull> <FieldRef Name='Column3' /> </IsNotNull> </And> </And> </Where> <OrderBy> <FieldRef Name='Column1' Ascending='True' /> <FieldRef Name='Column2' Ascending='True' /> <FieldRef Name='Column3' Ascending='True' /> </OrderBy> </Query> </any> </query> <viewFields> <any> <ViewFields> <FieldRef Name='Column1' /> <FieldRef Name='Column2' /> <FieldRef Name='Column3' /> </ViewFields> </any> </viewFields> <queryOptions> <any> <QueryOptions xmlns=''> <DateInUtc>TRUE</DateInUtc> <IncludeMandatoryColumns>FALSE</IncludeMandatoryColumns> </QueryOptions> </any> </queryOptions> </GetListItems>
使用SoapClientPlus,这会转换为...
array ( 'GetListItems' => array ( 'listName' => 'My List Name', 'rowLimit' => '150', 'query' => array ( 'any' => '<Query xmlns=""><Where><And><Eq><FieldRef Name="Column1"/><Value Type="Integer">1</Value></Eq><And><Neq><FieldRef Name="Column3"/><Value Type="Text">value i don\'t want/Value></Neq><IsNotNull><FieldRef Name="Column3"/></IsNotNull></And></And></Where><OrderBy><FieldRef Name="Column1" Ascending="True"/><FieldRef Name="Column2" Ascending="True"/><FieldRef Name="Column3" Ascending="True"/></OrderBy></Query>', ), 'viewFields' => array ( 'any' => '<ViewFields><FieldRef Name="Column1"/><FieldRef Name="Column2"/><FieldRef Name="Column3"/></ViewFields>', ), 'queryOptions' => array ( 'any' => '<QueryOptions xmlns=""><DateInUtc>TRUE</DateInUtc><IncludeMandatoryColumns>FALSE</IncludeMandatoryColumns></QueryOptions>', ), ), )
... 然后将其传递到标准SoapClient的自己的__soapCall方法。
注意 您不必使用XML,您可以传入一个数组。它只是在那里,因为有些人可能觉得这样更容易使用。我使用PHP的SimpleXMLElement实现来处理转换。
问题/评论
正如我在前言中所述,我创建这个库是为了帮助减轻在PHP中使用NTLM认证机制消费SharePoint服务时的痛苦。我总是欢迎社区的新特性想法,所以如果您正在使用这个库并且有建议,请告诉我。我总是喜欢接受挑战 :)