itmh/service-tools-soap-old

此包最新版本(v0.0.1)没有可用的许可证信息。

PHP SoapClient 类的包装器

v0.0.1 2015-08-31 07:48 UTC

This package is not auto-updated.

Last update: 2024-09-18 08:51:45 UTC


README

概述

这是我对原生PHP SOAP客户端实现(\SoapClient)的不足之处进行改进的尝试。

使用方法

实例化

<?php
$soapClient = new \Camcima\Soap\Client($wsdl, $options);

cURL 选项

此包装器使用cURL发出HTTP请求。您可以使用cURL选项自定义SOAP请求。

<?php
$curlOptions = array(
    CURLOPT_CRLF => true,
    CURLOPT_SSL_VERIFYPEER => true
);
$soapClient = new \Camcima\Soap\Client($wsdl, $options);
$soapClient->setCurlOptions($curlOptions);

然而,有一些cURL选项无法覆盖,因为它们对于包装器是必需的

<?php
// Mandatory cURL Options
CURLOPT_POST => true
CURLOPT_HEADER => true

要获取当前使用的cURL选项

<?php
$curlOptions = $soapClient->getCurlOptions();

使用代理

如果您需要代理请求(例如,调试),您可以使用此方法设置代理主机、端口和类型

<?php
$soapClient->useProxy('proxy.local', 8080, CURLPROXY_SOCKS5);

此方法的默认主机名、端口和类型是 localhost8888CURLPROXY_HTTP,这是Fiddler Web调试代理的默认绑定(http://fiddler2.com/)。

身份验证

为了使用HTTP身份验证,请使用SoapClient原始的loginpassword选项。cURL客户端将从那里获取它。

<?php
$soapClient = new Client($wsdlUrl, ['login' => 'joelogin', 'password' => 'joepassword']);

用户代理

您可以自定义客户端使用的用户代理

<?php
$soapClient->setUserAgent('MyUserAgent/1.0');

小写首字母

在我开发与基于.NET的Web服务的集成时,我注意到SOAP请求有效负载根元素名称的首字母总是小写的。其他内部元素的首字母始终大写,这与类名常见。我不知道这是否是.NET Web服务的规范,但无论如何,我实现了一个处理此问题的选项。

<?php
$soapClient->setLowerCaseFirst(true);

此设置的默认值为false

保留空属性

当您将对象作为SOAP参数传递时,它的某些属性可能是null(或未设置)。此客户端的默认行为是在发送请求时省略这些null属性。如果您需要发送所有属性,即使为null,请使用此选项

<?php
$soapClient->setKeepNullProperties(true);

此设置的默认值为true

调试

为了调试请求和响应,您需要将调试模式设置为true,并设置调试文件名和路径。

<?php
$soapClient->setDebug(true);
$soapClient->setDebugLogFilePath(__DIR__ . '/../../../../log/debug.log');

最后请求通信日志

您可以从最后请求中获取HTTP通信日志(请求和响应)。

<?php
$soapClient->getCommunicationLog();

结果类映射

PHP原生SOAP客户端实现可以将SOAP返回映射到本地类。不幸的是,它没有按预期工作。因此,我实现了自己的结果类映射版本。

它有两种不同的风味

使用Classmap

您必须构建一个关联数组,将结果元素作为键,对应的本地类作为值。

<?php
$soapClient = new Client($wsdlUrl);
$soapResult = $soapClient->GetCityForecastByZIP($getForecastByZip);
$resultClassmap = array(
    'GetCityForecastByZIPResult' => '\Camcima\Soap\Test\Fixtures\GetCityForecastByZIPResult',
    'ForecastResult' => '\Camcima\Soap\Test\Fixtures\ForecastResult',
    'array|Forecast' => '\Camcima\Soap\Test\Fixtures\ForecastEntry',
    'Temperatures' => '\Camcima\Soap\Test\Fixtures\Temperatures',
    'ProbabilityOfPrecipiation' => '\Camcima\Soap\Test\Fixtures\ProbabilityOfPrecipiation'
);
$getCityForecastByZIPResult = $soapClient->mapSoapResult($soapResult, 'GetCityForecastByZIPResult', $resultClassmap);

原生SOAP客户端返回所有对象作为标准类(StdClass),我的映射函数“转换为”映射的本地类。此函数基于包含标准类对象的属性名称。这在大多数情况下工作得很好,但当存在对象数组时,需要特殊配置

<?php
$mapping = array(
    'array|Forecast' => '\Camcima\Soap\Test\Fixtures'
);

包含数组的属性的名称用作映射的标记。您还需要在元素名称前加上前缀array,并使用竖线(|)来分隔它们。

使用命名空间

如果你的所有结果类都位于同一命名空间中,就没有必要单独映射它们。你可以告诉映射器你的类所在的命名空间,它将自动通过匹配SOAP结果名称与本地类名称来确定映射。

<?php
$resultClassNamespace = '\MyProject\SOAP\Result\\';

改进

我计划根据我的需求添加新功能。如果你需要一个特殊功能,你有两个选择

  • 自行开发并给我发送一个pull request。我保证尽快合并。

  • 创建一个issue并等待我开发。这可能会花费一些时间,因为我通常很忙。