我使用ZendFramework在Wordpress中创建了一个完整的插件,现在我想公开一个Web服务来访问数据,因为我需要创建一个c#importation应用程序。
我面临的问题是,即使我将webservice的类型设置为特定类型,但类图并没有引入并转换类型。例如:
/**
* Retursn all events registered on the sgm web interface
*
* @return models_event[]
*/
public function getAllEvents(){
return models_event::getEvents();
}
定义了在models_event数组中返回的类。如果我启动WSDL部分,我会将一个复杂的类型添加为“models_event”,但这是错误的:
$autodiscover = new Zend_Soap_AutoDiscover(array(
'classmap' => array(
'event' => "models_event",
),
'encoding' => 'utf-8'
));
$autodiscover->setComplexTypeStrategy(new Zend_Soap_Wsdl_Strategy_ArrayOfTypeComplex());
$autodiscover->setClass('models_webservice');
$autodiscover->handle();
我将models_event映射到事件。所以我的WSDL应该导出复杂类型:
<xsd:complexType name="ArrayOfmodels_event">
<xsd:complexContent>
<xsd:restriction base="soap-enc:Array">
<xsd:attribute ref="soap-enc:arrayType" wsdl:arrayType="tns:models_event[]"/>
</xsd:restriction>
</xsd:complexContent>
</xsd:complexType>
<xsd:complexType name="models_event">
<xsd:all/>
</xsd:complexType>
但正如你可以看到它返回一个models_event [] complexe类型和models_event复杂类型......我都搞砸了......为什么这样做?
答案 0 :(得分:2)
您使用的是什么版本的Zend Framework?
在我正在查看的版本(1.11.10)中,Zend_Soap_AutoDiscover
不会将一个选项数组作为构造函数参数之一。构造函数的方法签名如下:
public function __construct($strategy = true, $uri=null, $wsdlClass=null)
你所指的classmap
选项在Zend_Soap_Server
和IMO中,主要是因为Zend_Soap_Server主要只是PHP本地SoapServer
类的包装器,所以它的界面允许你访问基础类提供的所有选项。我也猜测存在classmap
选项是为了解决稍微不同的问题,这是你在基于预先存在的WSDL构建SOAP服务器并希望将WSDL名称映射到内部PHP类的地方名。
我的建议只是将models_event
课程重命名为event
(或者更好的是,Event
),这有助于让您更接近您在寻找的内容。 WSDL。