Zend Framework Classmap不受autodiscovery的尊重?

时间:2012-01-26 15:41:24

标签: php web-services zend-framework soap autodiscovery

我使用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复杂类型......我都搞砸了......为什么这样做?

1 个答案:

答案 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。