I did something similar, and this is an example 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(); }
This is a fragment of a function signature of one of the classes that auto-detection will generate wsdl based on annotations:
protected function searchPatientById($id) {
This is the class \ ViewModels \ PatientViewModel and \ ViewModel \ DiagnosisViewModel. Notice how I used annotations to declare that the field encodes an array of complex type, and then how it converts as ArrayOfDiagnosisViewModel to wsdl
namespace ViewModels; class PatientViewModel { public $id; public $firstname; public $lastname; public $diagnosis; } class DiagnosisViewModel { public $id; public $name; }
And this is created by WSDL
<?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>
A NOTE THAT IT IS EASY TO CHANGE THE STRATEGY AND THE CORRECT ANNOTATIONS OF THE DOCTORIES, YOU CAN ACCESS THIS.
HOPE THIS SNiPPPY MAY HELP YOU FIND A SOLUTION.
source share