こんにちは、この非常に古い PHP バグに似た奇妙なバグが発生しています。
https://bugs.php.net/bug.php?id=48966
唯一の違い: 私は、php の soap-client の classmap 関数を使用しています。
次のようになります。
class Client extends \SoapClient
{
//left something out here
const DOMAIN_MODEL_NAMESPACE = 'Domain\\Model\\';
/**
* @return array
*/
private function getClassmap()
{
return array(
'AddressCheck' => self::DOMAIN_MODEL_NAMESPACE . 'AddressCheck\\AddressCheckRequest',
'AddressCheckResponse' => self::DOMAIN_MODEL_NAMESPACE . 'AddressCheck\\AddressCheckResponse',
'matchingAddresses' => self::DOMAIN_MODEL_NAMESPACE . 'AddressCheck\\MatchingAddresses',
'address' => self::DOMAIN_MODEL_NAMESPACE . 'Common\\Address',
'RequestHeader' => self::DOMAIN_MODEL_NAMESPACE . 'Common\\Header\\RequestHeader',
'salesOrderEntry' => self::DOMAIN_MODEL_NAMESPACE . 'Common\\Header\\SalesOrderEntry'
);
}
/**
* @param Configuration\ConfigurationInterface $configuration
* @param string $wsdl
*/
public function __construct($wsdl, Configuration\ConfigurationInterface $configuration)
{
$options = array(
'classmap' => $this->getClassmap(),
'features' => SOAP_SINGLE_ELEMENT_ARRAYS,
'location' => $configuration->getServiceLocation(),
'trace' => 1,
'soap_version' => SOAP_1_1,
'exceptions' => 1,
'cache_wsdl' => 0
);
parent::__construct($wsdl, $options);
}
}
他のクラス:
$address = new Common\Address($street, $houseNumber, $postalCode, $city);
$request = new AddressCheck\AddressCheckRequest($address);
$response = $this->soapClient->__soapCall($requestName, array($request));
これはwsdl2PHPによって生成されますが、PSR-4 Autoloading に適合するように少し変更されています。
私の問題は、生成された XML リクエストにあります。
はずです (SOAPUi によって生成されます!): -> 私には SOAP_1_1 のように見えます。(正しい?)
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="http://webservices.aax2.compax.at">
<soapenv:Header/>
<soapenv:Body>
<web:AddressCheck>
<web:header>
<web:source>1</web:source>
<web:version>1.11</web:version>
<web:client>1</web:client>
<web:testing>0</web:testing>
<web:salesOrderEntry>
<web:partnerId>300011489</web:partnerId>
<web:distributionChannelId>300000011</web:distributionChannelId>
</web:salesOrderEntry>
</web:header>
<web:address>
<web:street>SomeStreet</web:street>
<web:houseNumber>6</web:houseNumber>
<web:zip>66666</web:zip>
<web:city>SomeCity</web:city>
</web:address>
</web:AddressCheck>
</soapenv:Body>
</soapenv:Envelope>
は (soap-client によって生成されます):
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ns1="http://webservices.aax2.compax.at">
<SOAP-ENV:Body>
<ns1:AddressCheck>
<header>
<source>1</source>
<version>1.11</version>
<client>1</client>
<testing>0</testing>
<salespartnerData xsi:nil="true"/>
<salesOrderEntry>
<partnerId>300011489</partnerId>
<distributionChannelId>300000011</distributionChannelId>
</salesOrderEntry>
<last_user xsi:nil="true"/>
<timeOfCall xsi:nil="true"/>
<clientIP xsi:nil="true"/>
<orderContext xsi:nil="true"/>
<scanId xsi:nil="true"/>
</header>
<address>
<street>SomeStreet</street>
<houseNumber>6</houseNumber>
<zip>66666</zip>
<city>SomeCity</city>
<buildingType xsi:nil="true"/>
<buildingPart xsi:nil="true"/>
<buildingPartNotes xsi:nil="true"/>
<buildingPartDetail xsi:nil="true"/>
<floor xsi:nil="true"/>
<notes xsi:nil="true"/>
<noOfCorrections xsi:nil="true"/>
</address>
</ns1:AddressCheck>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
ご覧のとおり、ネストされたノードのプレフィックスがありません。 soap-client のドキュメントは非常に薄いですが、WSDL は巨大なので、手動で XML を生成したり操作したりしたくありません!
WSDL で正確に何が間違って構成されている可能性がありますか? 必要であれば、それらの情報も提供できます。しかし、WSDL 全体ではありません。
クラスマップはまったく使用されていないように思えます..(タイプミスかもしれませんか?)しかし、クラスマップをデバッグする方法がわかりません?!