1 回答

TA貢獻1804條經驗 獲得超2個贊
您可以從 wsdl 讀取復雜類型定義作為 php 類定義。每個復雜類型都是一個 php 值對象。抽象復雜類型是抽象的值對象,可以從中繼承。
由于我們定義了復雜類型,我們可以構建我們的 php 類。
abstract class HomeAffairsIDVRequestBase
{
protected bool $IsBatchSearch;
protected int $ParentRequestId;
protected ?string $Reference;
protected ?string $Requester;
protected string $SessionId;
public function getIsBatchSearch(): bool
{
return $this->IsBatchSearch;
}
public function setIsBatchSearch(bool $isBatchSearch): self
{
$this->isBatchSearch = $isBatchSearch;
return $this;
}
public function getParentRequestId(): int
{
return $this->ParentRequestId;
}
public function setParentRequestId(int $parentRequestId): self
{
$this->ParentRequestId = $parentRequestId;
return $this;
}
public function getReference(): ?string
{
return $this->Reference;
}
public function setReference(string $reference): self
{
$this->Reference = $reference;
return $this;
}
public function getRequester(): ?string
{
return $this->Requester;
}
public function setRequester(string $requester): self
{
$this->Requester = $requester;
return $this;
}
public function getSessionId(): string
{
return $this->SessionId;
}
public function setSessionId(string $sessionId): self
{
$this->SessionId = $sessionId;
return $this;
}
}
這是我們作為抽象 php 類的第一個抽象復雜類型定義HomeAffairsIDVRequestBase。如您所見,抽象類具有所有屬性,這些屬性在 wsdl 文件中為此復雜類型定義。除此之外,我們還有 getter 和 setter 方法來更好地處理類屬性。
當我們查看 for 的定義時HomeAffairsIDVStandardRequest,我們可以看到它繼承自HomeAffairsIDVRequest. 考慮到這一點,我們必須編寫更多的 php 類。
abstract class HomeAffairsIDVRequest extends HomeAffairsIDVRequestBase
{
protected ?string $IdNumber;
public function getIdNumber(): ?string
{
return $this->IdNumber;
}
public function setIdNumber(?string $idNumber): self
{
$this->IdNumber = $idNumber;
return $this;
}
}
class HomeAffairsIDVStandardRequest extends HomeAffairsIDVRequest
{
}
由于其中一種復雜類型HomeAffairsIDVStandardRequest不是HomeAffairsIDVAdvancedRequest抽象的,因此可以將此類用于請求。請記住,抽象 php 類不能直接初始化。wsdl 中的抽象復雜類型也是如此。
現在我們需要將請求元素作為一個類。這是我們 soap 請求中的父元素。該PlaceRequest元素只有一個屬性,稱為request。由于此元素是 的繼承HomeAffairsIDVRequestBase并且此定義是抽象的,因此我們必須稍后在請求中使用類型屬性。
class PlaceRequest
{
protected HomeAffairsIDVRequestBase $request;
public function getRequest(): HomeAffairsIDVRequestBase
{
return $this->request;
}
public function setRequest(HomeAffairsIDVRequestBase $request): self
{
$this->request = $request;
return $this;
}
}
到目前為止,我們將數據結構作為 PHP 值對象。到目前為止,這就是我們所需要的?,F在讓我們看一下可能的請求。
try {
$wsdl = 'https://path.to.your.wsdl.file.com?wsdl';
$client = new SoapClient($wsdl, [
'exceptions' => true,
'trace' => true,
]);
// initialize our value object
$standard = (new HomeAffairsIDVStandardRequest())
->setIsBatchSearch(false)
->setParentRequestId(0)
->setReference('test')
->setRequester('requester')
->setSessionId('true')
->setIdNumber($idNumber);
// initialize our request element
$request = (new PlaceRequest())
->setRequest($standard);
$response = $client->placeRequest($request);
} catch (SoapFault $fault) {
// error handling like var_dump($fault)
}
由于我沒有看到完整的 wsdl 內容,所以我不能說請求 XML 應該是什么樣子。上面顯示的結果可能會導致 soap 故障。在這種情況下,請嘗試以下示例。
更改類中的類型提示PlaceRequest。
class PlaceRequest
{
protected SoapVar $request;
public function getRequest(): SoapVar
{
return $this->request;
}
public function setRequest(SoapVar $request): self
{
$this->request = $request;
return $this;
}
}
之后使用該實例創建一個新的 SoapVar 實例$standard。
// we 've already defined the $standard object above (sets an type attribute for the request node)
$standard = new SoapVar($standard, SOAP_ENC_OBJECT, 'HomeAffairsIDVStandardRequest', 'http://your.namespace.tld/namespace', 'request', 'http://your.namespace.tld/namespace');
// initialise the request element and set the soap var parameter
$request = (new PlaceRequest())
->setRequest($standard);
// send it via soap client
$client->PlaceRequest($request);
作為附加信息,您應該始終查看發送的 xml 和接收到的 xml,以便更好地了解錯誤處理。我們trace在初始化 soap 客戶端時設置了選項。這使我們能夠看到最后的請求和最后的響應是什么。
...
} catch (SoapFault $fault) {
if ($client) {
// get last request
var_dump($client->__getLastRequest());
// get last response
var_dump($client->__getLastResponse());
}
}
- 1 回答
- 0 關注
- 124 瀏覽
添加回答
舉報