3

ZendFrameworkを使用してWordpressで完全なプラグインを作成しましたが、ac#インポートアプリケーションを作成する必要があるため、データにアクセスするためのWebサービスを公開したいと思います。

私が直面している問題は、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();

マップされたmodels_eventを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[]複合型とmodels_event複合型を返しています...私はすべて混乱しています...なぜこれを行うのですか?

4

1 に答える 1

2

どのバージョンのZendFrameworkを使用していますか?

私が見ているバージョン(1.11.10)ではZend_Soap_AutoDiscover、コンストラクター引数の1つとしてオプションの配列を取りません。コンストラクターのメソッドシグネチャは次のとおりです。

    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で探しているものに近づくことができます。

于 2012-01-27T04:37:24.957 に答える