我正在创建一个Web服务,我添加了一个接收对象但是我的soap客户端无法识别其属性的操作
<?php
class Application_Model_Contact {
private $id;
private $name;
private $phone;
/**
*
* @param String $nome
* @param String $phone
*/
public function __construct($nome = null, $phone = null) {
....
}
}
...
class Application_Model_WebServices
{
/**
*
* @param Application_Model_Contact $contact
* @return boolean
*/
public function adicionar(Application_Model_Contact $contact){
return true;
}
}
...
if (isset($_GET['wsdl'])) {
$autodiscover = new Zend_Soap_AutoDiscover();
$autodiscover->setClass('Application_Model_WebServices');
$autodiscover->handle();
} else {
$server = new Zend_Soap_Server();
$server->setOptions(array(
'soap_version' => SOAP_1_2,
'actor' => 'http://localhost/AgendaTelefonicaPHPSOAP/public/webservice.php',
'encoding' => 'UTF-8'
));
$server->setWsdl('http://localhost/AgendaTelefonicaPHPSOAP/public/webservice.php?wsdl');
$server->setClass('Application_Model_WebServices');
$server->handle();
}
使用soapUI,我得到以下xml来添加这个对象
<soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="http://localhost/AgendaTelefonicaPHPSOAP/public/webservice.php">
<soapenv:Header/>
<soapenv:Body>
<web:adicionar soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<contact xsi:type="web:Application_Model_Contact"/>
</web:adicionar>
</soapenv:Body>
</soapenv:Envelope>
为什么我的类属性无法被识别?
答案 0 :(得分:1)
为了让Zend_Soap_Autodiscover
向WSDL添加复杂类型,它需要能够使用反射来查看属性,并且需要docblock来告知它每个属性的类型。
因此,为了让您的WSDL包含这些复杂类型,然后允许您的客户端在SOAP请求中传递这些类型,您需要按如下方式调整Applicaton_Model_Contact
类:
class Application_Model_Contact {
/** @var string */
public $id;
/** @var string */
public $name;
/** @var string */
public $phone;
/**
*
* @param String $nome
* @param String $phone
*/
public function __construct($nome = null, $phone = null) {
....
}
}
我在修改之前和之后运行了您的代码,并且可以确认在此修改之后,联系人记录的属性已成功传递到adicionar()
方法。