2013-06-25 33 views
6

Tôi đang chuẩn bị máy chủ SOAP và WSDL tạo của tôi sử dụng mã sau:Zend Framework 2 SOAP AutoDiscover và phức tạp loại

//(... Controller action code ...) 
if (key_exists('wsdl', $params)) { 
    $autodiscover = new AutoDiscover(); 
    $autodiscover->setClass('WebServiceClass') 
       ->setUri('http://server/webserver/uri'); 
    $autodiscover->handle(); 
} else { 
    $server = new Server(null); 
    $server->setUri($ws_url); 
    $server->setObject($this->getServiceLocator()->get('MyController\Service\WebServiceClass')); 
    $server->handle(); 
} 

//(... Controller action code ...) 

Nhưng trong một trong những phương pháp WebService của tôi, tôi có một tham số kiểu mảng trong đó mỗi phần tử là loại "MyOtherClass", như sau:

/** 
    * Add list of MyOtherClass items 
    * 
    * @param MyOtherClass[] $items 
    * 
    * @return bool 
    */ 
    function add($items) { 
     // Function code here 
    } 

Khi tôi cố gắng tạo ra WSDL tôi nhận được lỗi sau:

PHP Warning: DOMDocument::loadXML(): Empty string supplied as input in /<zend framweork path>/Server/vendor/zendframework/zendframework/library/Zend/Soap/Server.php on line 734 

Hoặc ngoại lệ này:

Cannot add a complex type MyOtherClass[] that is not an object or where class could not be found in "DefaultComplexType" strategy. 

Khi tôi thêm vào một cái gì đó mã của tôi như thế này:

//(...) 
if (key_exists('wsdl', $params)) { 

    $autodiscover = new AutoDiscover(); 
    $autodiscover->setClass('WebServiceClass'); 
    $autodiscover->setUri($ws_url); 

    $complex_type_strategy = new \Zend\Soap\Wsdl\ComplexTypeStrategy\ArrayOfTypeComplex(); 
    $complex_type_strategy->addComplexType('MyOtherClass'); 
    $autodiscover->setComplexTypeStrategy($complex_type_strategy); 
    $autodiscover->handle(); 
} else { 
//(...) 

Tôi nhận được thông báo lỗi sau:

Fatal error: Call to a member function getTypes() on a non-object in /<project dir>/vendor/zendframework/zendframework/library/Zend/Soap/Wsdl/ComplexTypeStrategy/AbstractComplexTypeStrategy.php on line 54 

Trong sơ yếu lý lịch, câu hỏi là : làm thế nào tôi có thể biết WSDL của Loại tùy chỉnh mới được sử dụng làm tham số?

Cảm ơn

+0

'MyOtherClass []' có vẻ sai với tôi trong ngữ cảnh php. Tôi muốn thử tạo đối tượng MyOtherClassCollection chứa các phần tử. – DanielKhan

+0

'MyOtherClass []' định nghĩa một mảng các đối tượng MyOtherClass. Điều này là hoàn toàn tốt trong PHP cho các chế độ Zend \ Soap \ AutoDiscover 'ArrayOfTypeSequence' và' ArrayOfTypeComplex'. –

Trả lời

3

tôi đã làm một cái gì đó tương tự và đây là một số mẫu mã:

/* code.... */ 
if (array_key_exists('wsdl', $this->request->getQuery()) || array_key_exists('WSDL', $this->request->getQuery())) { 

        $auto = new \Zend\Soap\AutoDiscover(new \Zend\Soap\Wsdl\ComplexTypeStrategy\ArrayOfTypeSequence()); 

        $auto->setClass($controllerClassName); 
        $auto->setUri(sprintf('%s://%s%s', \Application\Bootstrap::getServiceManager()->get('config')[APPLICATION_ENV]['webServer']['protocol'], 
                $this->request->getUri()->getHost() , $this->request->getUri()->getPath())); 
        $auto->setServiceName(ucfirst($this->request->getModuleName()) . ucfirst($this->request->getControllerName())); 

        header('Content-type: application/xml'); 

        echo $auto->toXML(); 



       } elseif (count($this->request->getQuery()) == 0) { 

        $this->preDispatch(); 

        $wsdl = sprintf('%s://%s%s?wsdl', \Application\Bootstrap::getServiceManager()->get('config')[APPLICATION_ENV]['webServer']['protocol'], 
                $this->request->getUri()->getHost() , $this->request->getUri()->getPath()); 

        $soapServer = new \Zend\Soap\Server($wsdl); 
        $soapServer->setClass($controllerClassName); 
        $soapServer->handle(); 
       } 

/* code */ 

Đây là một đoạn của hàm chữ ký của một trong các lớp rằng autodiscover sẽ tạo ra wsdl dựa trên chú thích:

/** 
* Allows to search for a patient based on the patient id 
* 
* @param int $id 
* @return \ViewModels\PatientViewModel 
* @throws \Application\Exception 
*/ 
protected function searchPatientById($id) { 
/* .... code */ 

Đây là lớp học \ ViewModels \ PatientViewModel và \ ViewModel \ DiagnosisViewModel Thông báo ở đây làm thế nào tôi sử dụng các chú thích phải tuyên bố rằng một lĩnh vực conatins một mảng của một complexType, và sau đó làm thế nào mà được dịch là ArrayOfDiagnosisViewModel trên wsdl

namespace ViewModels; 

    class PatientViewModel { 

     /** 
     * @var int 
     * */ 
     public $id; 

     /** 
     * @var string 
     * */ 
     public $firstname; 

     /** 
     * @var string 
     * */ 
     public $lastname; 

     /** 
     *** @var \ViewModels\DiagnosisViewModel[]** 
     * */ 
     public $diagnosis; 

    } 

class DiagnosisViewModel { 

    /** 
    * @var int 
    */ 
    public $id; 

    /** 
    * @var string 
    */ 
    public $name; 

} 

Và đây là WSDL được tạo

<?xml version="1.0" encoding="UTF-8"?> 
<definitions xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://soa.local/soap/Sample/Main" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap-enc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" name="SampleMain" targetNamespace="http://soa.local/soap/Sample/Main"> 
    <types> 
     <xsd:schema targetNamespace="http://soa.local/soap/Sample/Main"> 
      <xsd:complexType name="DiagnosisViewModel"> 
       <xsd:all> 
        <xsd:element name="id" type="xsd:int" nillable="true"/> 
        <xsd:element name="name" type="xsd:string" nillable="true"/> 
       </xsd:all> 
      </xsd:complexType> 
      **<xsd:complexType name="ArrayOfDiagnosisViewModel"> 
       <xsd:sequence> 
        <xsd:element name="item" type="tns:DiagnosisViewModel" minOccurs="0" maxOccurs="unbounded"/> 
       </xsd:sequence> 
      </xsd:complexType>** 
      <xsd:complexType name="PatientViewModel"> 
       <xsd:all> 
        <xsd:element name="id" type="xsd:int" nillable="true"/> 
        <xsd:element name="firstname" type="xsd:string" nillable="true"/> 
        <xsd:element name="lastname" type="xsd:string" nillable="true"/> 
        <xsd:element name="diagnosis" type="tns:ArrayOfDiagnosisViewModel" nillable="true"/> 
       </xsd:all> 
      </xsd:complexType> 
     </xsd:schema> 
    </types> 
    <portType name="SampleMainPort"> 
     <operation name="searchPatientById"> 
      <documentation>Allows to search for a patient based on the patient id</documentation> 
      <input message="tns:searchPatientByIdIn"/> 
      <output message="tns:searchPatientByIdOut"/> 
     </operation> 
    </portType> 
    <binding name="SampleMainBinding" type="tns:SampleMainPort"> 
     <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/> 
     <operation name="searchPatientById"> 
      <soap:operation soapAction="http://soa.local/soap/Sample/Main#searchPatientById"/> 
      <input> 
       <soap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://soa.local/soap/Sample/Main"/> 
      </input> 
      <output> 
       <soap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://soa.local/soap/Sample/Main"/> 
      </output> 
     </operation> 
    </binding> 
    <service name="SampleMainService"> 
     <port name="SampleMainPort" binding="tns:SampleMainBinding"> 
      <soap:address location="http://soa.local/soap/Sample/Main"/> 
     </port> 
    </service> 
    <message name="searchPatientByIdIn"> 
     <part name="id" type="xsd:int"/> 
    </message> 
    <message name="searchPatientByIdOut"> 
     <part name="return" type="tns:PatientViewModel"/> 
    </message> 
</definitions> 

THÔNG BÁO R JNG B JNG CHỨNG NHẬN THAY ĐỔI CHIẾN LƯỢC VÀ QUYỀN LỢI QUYỀN SỰ AN TOÀN BẠN CÓ THỂ ĐẠT ĐƯỢC R THNG.

HY VỌNG NÀY CÓ THỂ GIÚP BẠN ĐỂ TÌM GIẢI PHÁP.

+0

Xin chào !, cảm ơn tôi sẽ kiểm tra và cho bạn biết. +1 cho ý tưởng. – leticia

+0

tất cả tôi nhận được là: Không thể thêm loại phức tạp \ ViewModels \ DiagnosisViewModel ** không phải là đối tượng hoặc không tìm thấy lớp trong chiến lược "DefaultComplexType". tôi đang thiếu gì? thx trước! – wolxXx

Các vấn đề liên quan