我正在使用Zend_Soap_Server在PHP中使用自动发现模式创建web服务,我想知道如何使用phpDoc或任何其他方式对特定变量/函数参数生成限制(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
来限制函数参数(minOccurs
&amp; maxOccurs
),我该怎么做才能使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 :(得分:1)
如果有些人仍然感兴趣...在zend框架邮件列表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]);
}
显然,如果您更喜欢定义的不同模式,则可以调整这些正则表达式。
答案 1 :(得分:1)
如果这仍然适合某人:更简洁的方法可能是实现一个自定义策略类来构建复杂的类型定义 - 这是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 { ... }
希望这有助于某人。
答案 2 :(得分:0)
我在最近的一个项目中寻找答案。据我所知,这在当前版本的ZF中是不可能的(参见“bug”)。
我认为AutoDiscovery仅适用于最基本的WSDL生成。或至少目前的版本是。也许未来的版本会更全面。
这是一个很好的起点,您可以使用模板手动构建更复杂的约束。或者,您可以构建自己的类来处理您的特定要求(如对此question的答案的评论中所建议的那样)
答案 3 :(得分:0)
有一个提案,我发现包含复杂类型的修改代码,但我不确定它是否曾经实现过,我还没有机会测试它。退房: