2012-07-18 14 views
0

我正在使用Zend_Soap_Server在PHP中使用自動發現模式創建webservice,我想知道如何使用phpDoc或任何其他方式對特定變量/函數參數生成限制(minOccurs,maxOccurs)。如何在函數phpDoc中爲Zend_Soap_Server定義minOccurs和maxOccurs?

像下面,當我使用這個PHPDoc的在功能說myFunction

/** 
* 
* @param string $param1 Parameter One 
* @param string $param2 Parameter Two 
* @return array $return 
*/ 

它給了我在WSDL以下消息:

<message name="myFunctionIn"> 
    <part name="param1" type="xsd:string"/> 
    <part name="param2" type="xsd:string"/> 
</message> 
<message name="myFunctionOut"> 
    <part name="return" type="soap-enc:Array"/> 
</message> 

所以,如果我想限制函數參數(param1 & param2)使用minOccursmaxOccurs我該怎麼做才能使WSDL消息如下所示:

<message name="myFunctionIn"> 
    <part name="param1" minOccurs="0" maxOccurs="1" type="xsd:string"/> 
    <part name="param2" minOccurs="1" maxOccurs="1" type="xsd:string"/> 
</message> 

我在互聯網上搜索,但找不到任何有用的信息。 謝謝!

回答

0

我在最近的一個項目中尋找答案。據我所知,在ZF的當前版本中這是不可能的(參見「bug」)。

我認爲AutoDiscovery只適用於最基本的WSDL代。或者至少現在的版本是。也許未來的版本會更全面。

作爲一個出發點,您可以使用模板手動構建更復雜的約束。或者,你可以建立自己的班級來處理你的具體要求(如對此question的回答中的建議)

+0

據我所知,我看到的大多數帖子都顯示對提煉服務器代碼缺乏興趣,或聲稱在不破壞代碼的情況下很難做到這一點。大多數帖子的共識是自動發現只是爲wsdl提供一個開始框架,然後你可以修改並從一個靜態文件返回。 我假設這意味着擴展屬性的錯誤處理是程序員的責任,而不是zend引擎。 – Scott 2014-07-02 15:27:32

0

如果有些人仍然有興趣... ...有一個相當簡單的補丁發佈了Zend Framework的郵件列表here上。 它允許在下面的風格來定義的minOccurs和maxOccurs:

/** 
* @var string ___FOR_ZEND_minOccurs=0 ___FOR_ZEND_maxOccurs=1 
*/ 
public $Username; 

這是翻譯的WSDL來:

<xsd:element name="Username" type="xsd:string" nillable="true" maxOccurs="1" minOccurs="0"/> 

必要的代碼更改需要58行,它看起來像後要插入的:要被插入

($element->setAttribute('type', $this->getContext()->getType(trim($matches[1][0])));) 

代碼:

$tempo = $property->getDocComment(); 
if (preg_match('/___FOR_ZEND_minOccurs\s*=\s*(\d+|unbounded)/',$tempo,$matches)) { 
    $element->setAttribute('minOccurs', $matches[1]); 
} 
if (preg_match('/___FOR_ZEND_maxOccurs\s*=\s*(\d+|unbounded)/',$tempo,$matches)) { 
    $element->setAttribute('maxOccurs', $matches[1]); 
} 

很顯然,如果您更喜歡定義的不同模式,則可以調整這些正則表達式。

0

如果這仍然與某人有關:更清晰的方法可能是實現一個自定義策略類來構建複雜類型定義 - 這實際上由Zend_Soap正式支持。

做到這一點,創建一個從Zend_Soap_Wsdl_Strategy_ArrayOfTypeSequence繼承的類(指的是ZF 1.x,但在較新的框架版本中看起來類似,只是命名空間)。

在您的新類中,通過從父類複製整個方法體,重載_addElementFromWsdlAndChildTypes方法。

現在你可以開始操作的代碼,並通過創建特定的$ childTypeName反射對象添加的docblock解析器:

// add the following after 
// $element = $dom->createElement('xsd:element'); 
$strippedTypeName = substr($childTypeName, 4); // strip xml namespace 
$reflect = new \Zend_Reflection_Class($strippedTypeName); 
if ($reflect->getDocblock()->hasTag('myTagName')) { 
    $tagValues = $reflect->getDocblock()->getTags('myTagName'); 
    // do whatever you want with your attribute values and then 
    // add them to the XML element: 
    $element->setAttribute($attributeName, $attributeValue); 
} 

當你完成,你可以設置你的新類作爲類型策略創建自動發現實例時:

new Zend_Soap_AutoDiscover(
    'MyNewStrategyClass', $namespace 
); 

大功告成。現在,無論您何時定義了一個應該具有自定義minOccurs,maxOccurs或任何其他設置的複雜類型的類,都可以使用@myTagName標記和您想要定義屬性值的任何語法(例如,

/** 
* MyCustomType DocBlock description 
* @myTagName minOccurs=0 
* @myTagName maxOccurs=10 
*/ 
class MyCustomType { ... } 

希望這可以幫助別人。

相關問題