3

我使用 ZendFramework 在 Wordpress 中创建了一个完整的插件,现在我想公开一个 Web 服务来访问数据,因为我需要创建 ac# 导入应用程序。

我面临的问题是,即使我将 web 服务返回的类型设置为特定类型,类映射也不会启动并转换类型。例如:

/**
 * 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();

我将模型事件映射到事件。所以我的 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 complexe 类型......我都搞砸了......为什么要这样做?

4

1 回答 1

2

您正在使用哪个版本的 Zend Framework?

在我正在查看的版本(1.11.10)中,Zend_Soap_AutoDiscover不将选项数组作为构造函数参数之一。构造函数的方法签名如下:

    public function __construct($strategy = true, $uri=null, $wsdlClass=null)

classmap您所指的选项在Zend_Soap_ServerIMO 中存在,主要是因为 Zend_Soap_Server 主要只是 PHP 本机SoapServer类的包装器,因此它的接口允许您访问底层类提供的所有选项。我还猜测该classmap选项的存在是为了解决一个稍微不同的问题,即您正在基于预先存在的 WSDL 构建 SOAP 服务器并希望将 WSDL 名称映射到内部 PHP 类名称。

我的建议只是将models_event类重命名为event(或者,更好的是,Event),这有望使您更接近您在 WSDL 中寻找的内容。

于 2012-01-27T04:37:24.957 回答