1

我正在创建一个 Web 服务,我添加了一个接收对象但我的肥皂客户端无法识别其属性的操作

<?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>

为什么我的类属性没有被识别?

4

1 回答 1

1

为了Zend_Soap_Autodiscover向 WSDL 添加复杂类型,它需要能够使用反射查看属性,并且需要 docblocks 来告知它每个属性的类型。

因此,为了让您的 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()方法中。

于 2012-09-19T12:05:32.583 回答