2012-01-26 10 views
3

私はWordpressでZendFrameworkを使って完全なプラグインを作成しましたが、今はC#インポートアプリケーションを作成する必要があるため、Webサービスからデータにアクセスしたいと考えています。Zend Frameworkクラスマップは自動検出によって尊重されませんか?

私が直面している問題は、Webサービスの戻り値の型を特定の型に設定しても、クラスマップがキックインして型を変換していないということです。例:

/** 
* Retursn all events registered on the sgm web interface 
* 
* @return models_event[] 
*/ 
public function getAllEvents(){ 
    return models_event::getEvents(); 
} 

は、クラスがmodels_event配列で返されることを定義します。私は、WSDLのセクションを起動した場合、私は間違って何をHERES「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(); 

Iクラスイベントに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複合型を返すされて見ることができるように...私は、すべての理由、それはやっている...めちゃくちゃですこの?

答えて

2

あなたはどのバージョンのZend Frameworkを使用していますか?

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

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

あなたが参照しているclassmapオプションがZend_Soap_ServerであるとZend_Soap_Serverのは、主にPHPのネイティブSoapServerクラス単なるラッパーなので、それはインターフェースができますだから、IMO、主に存在します基になるクラスによって提供されるすべてのオプションにアクセスすることができます。私はまた、既存のWSDLに基づいてSOAPサーバーを構築し、WSDL名を内部のPHPクラス名にマッピングしたいという若干異なる問題を解決するために、classmapオプションが存在すると推測しています。

私のアドバイスは、単にうまくいけば、あなたがWSDLで探しているものにあなたが近づくれる、event(または、より良いまだ、Event)へmodels_eventクラスの名前を変更することです。

+0

答えに感謝しますが、Zend Autoloaderを使用している私のオートローディング戦略の一部であるため、クラスの名前を変更できません。クラスマップに関しては、WSDLがサーバーによって返されるクラスと一致しないため、自動検出に渡す方法が必要です。私はあなたが間違っていると言っているわけではありませんが、ここに欠けているものは間違いありません。 –

+0

私はクラスの名前を変更できないということを理解しています。私の実装では、コントローラは適切なZend MVCスタイルで実装されていますが、 'setClass()'の呼び出しで使用されるクラスでドラッグするのに 'require_once()'を使います。 – JamesG

+1

また、 'AutoDiscover'クラスは、あなたが提供する実際のクラスや関数から純粋に機能しているように見えます。例えば、 'setClass()'メソッドは、リフレクションを使ってWSDLの内容を解決するように見えます。あなたのクラスのメソッド名からの名前と任意の関数名のセットへのマッピングを許可する機能はないようです。だから私はあなたのクラスの名前を変更し、 'require_once()'を使って手動でドラッグすることがあなたの唯一の選択肢かもしれないと思います。あるいは、クラスマッピング機能を 'Zend_Soap_AutoDiscover'に追加することもできます。 :-) – JamesG

関連する問題