操作接收Zend Soap Server对象

时间:2012-09-17 03:12:44

标签: php soap soap-client zend-soap

我正在创建一个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>

为什么我的类属性无法被识别?

1 个答案:

答案 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()方法。