2012-01-26 4 views
3

저는 ZendFramework를 사용하여 Wordpress에 완전한 플러그인을 만들고 지금은 C# import application을 생성해야하기 때문에 webservice에 데이터를 공개하고 싶습니다.Zend Framework 자동 검색으로 Classmap을 존중하지 않습니까?

내가 직면 한 문제는 특정 형식으로 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"로 추가했지만를 heres 잘못 것을 얻을 : 이벤트에

$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은 생성자 인수 중 하나로서 옵션 배열을 사용하지 않습니다. 다음과 같이 생성자의 메소드 서명은 다음과 같습니다

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

당신이 언급되는 classmap 옵션은 Zend_Soap_Server에 있고, Zend_Soap_Server 대부분 PHP의 기본 SoapServer 클래스 주위에 단지 래퍼이기 때문에 IMO, 주로 존재, 그래서 인터페이스가 있습니다입니다 기본 클래스에서 제공하는 모든 옵션에 액세스 할 수 있습니다. 또한 약간 다른 문제를 해결하기 위해 classmap 옵션이 존재한다고 추측합니다. 기존의 WSDL을 기반으로 SOAP 서버를 구축하고 WSDL 이름을 내부 PHP 클래스 이름에 매핑하려는 경우입니다.

내 조언은 단순히 희망 가까이가 WSDL에서 찾고있는 당신을 얻을 것이다 (더 나은 여전히하거나, Event) event,에 models_event 클래스의 이름을 변경하는 것입니다.

+0

답변을 주셔서 감사합니다.하지만 Zend Autoloader를 사용하여 내 자동로드 전략의 일부이기 때문에 클래스 이름을 바꿀 수 없습니다. 클래스 맵에 관해서는 WSDL이 서버에 의해 반환 된 클래스와 일치하지 않기 때문에 autodiscovery를 넘겨 줄 수있는 방법이 있어야합니다. 나는 네가 틀렸다는 것을 말하지는 않지만 분명히 우리가 여기에없는 뭔가가있다 ... –

+0

나는 그 클래스의 이름을 바꿀 수 없다는 것에 대해 당신이 말하는 것을 이해한다. 내 구현에서는 적절한 젠드 MVC 스타일로 구현 된 컨트롤러가 있지만'setClass()'에 대한 호출에서 사용되는 클래스에서 드래그 할 때'require_once()'를 사용합니다. – JamesG

+1

나는'AutoDiscover' 클래스가 실제 클래스 나 함수를 제공하는 것에서 만 순전히 작동하는 것 같다고 덧붙였다. 예를 들어, setClass() 메소드는 리플렉션을 사용하여 WSDL의 내용을 처리하는 것처럼 보인다. 클래스의 메서드 이름에서 이름을 임의의 함수 이름 집합으로 매핑 할 수있는 기능이없는 것 같습니다. 그래서 당신의 클래스의 이름을 바꾸고 그것을 수동으로'require_once()'를 사용하여 드래그하는 것이 당신의 유일한 선택 일 것이라고 생각합니다. 또는 클래스 매핑 기능을'Zend_Soap_AutoDiscover'에 추가 할 수 있습니다. :-) – JamesG

관련 문제