2011-05-18 56 views
4

我使用Zend soap autodiscovery來爲我的Web服務器WSDL文件的nillable =「真」。問題是每個complexType的每個元素都默認爲nillable="true"。我如何根據需要聲明元素?我讀了PHPDoc但什麼也沒找到。Zend的肥皂自動發現和生成WSDL

編輯:代碼:

class MyService { 
    /** 
    * Identify remote user. 
    * 
    * @param LoginReq 
    * @return LoginResp 
    */ 
    public function login($request) { 
    // Code .... 
    } 
} 

class LoginReq { 
    /** @var string */ 
    public $username; 
    /** @var string */ 
    public $password; 
} 
class LoginResp { 
    /** @var string */ 
    public $errorCode; 
} 

生成WSDL:

<xsd:complexType name="LoginReq"> 
    <xsd:all> 
     <xsd:element name="username" type="xsd:string" nillable="true"/> 
     <xsd:element name="password" type="xsd:string" nillable="true"/> 
    </xsd:all> 
    </xsd:complexType> 
    <xsd:complexType name="LoginResp"> 
    <xsd:all> 
     <xsd:element name="errorCode" type="xsd:string" nillable="true"/> 
    </xsd:all> 
    </xsd:complexType> 

EDIT2:我剛剛發現,須申報的元素/可選的,你需要使用minOccurs/maxOcurrs。它們都默認爲1,所以默認情況下每個元素都是必需的。爲了聲明一個可選元素,你用聲明它。 Nillable只是讓元素變成空的。再次,我如何聲明一個元素爲可選的(所以Zend將minOccurs =「0」添加到該元素)?

回答

10

,如果你在你的函數定義設置的默認值,這將是的nillable。

public function myMethod($argument = 'hello') { 
    // $argument is nillable 
} 

如果不是這樣,你可以發佈你的代碼與doc塊?

編輯:您的代碼示例闡明瞭很多。

如果你看的Zend /香皂/ WSDL /策略/ DefaultComplesType.php左右線76,你會看到這一點:

  // If the default value is null, then this property is nillable. 
      if ($defaultProperties[$propertyName] === null) { 
       $element->setAttribute('nillable', 'true'); 
      } 

這是確定你的「複合型」屬性的代碼是可以理解的。我會嘗試更新您的代碼以包含字符串的默認值。喜歡的東西:

class LoginReq { 
    /** @var string */ 
    public $username = ''; 
    /** @var string */ 
    public $password = ''; 
} 

如果你這樣做,=== null應該評估爲false。儘管如此,請確保您的代碼正確處理數據驗證。

如果不行,讓我知道!

+0

你好,我包括一些代碼,謝謝。 – 2011-05-18 09:04:54

+1

感謝您挖掘Zend的源代碼!爲你的努力+1。我不明白爲什麼默認行爲是一切都可以刪節,但使用默認值的屬性。它不應該是相反的嗎?順便說一句,我剛發現這不是我所期待的。我需要知道如何在某些元素上強制執行'minOccurs = 0'。 – 2011-05-23 11:47:53

+0

Zend中唯一提到minOccurs的是Zend/Soap/Wsdl/Strategy/ArrayOfTypeSequence〜145行,它被硬編碼爲0.我有一種感覺,要做你正在嘗試做的事情,你將不得不創建你自己的類庫,它擴展了Zend類併爲你需要的對象添加了minOccurs。我做過那種事了不少,只是儘量保持,所以當你更新的Zend你是不太可能有衝突的變化降至最低。 – jopke 2011-05-26 07:00:38