2017-03-14 2 views
0

Ich versuche, Soap-Server durch folgende Tutorial https://framework.zend.com/blog/2017-01-24-zend-soap-server.html einrichten.Zend Soap-Server-Beispiel

Meine entsprechenden Änderungen

<?php 
namespace Soap\Controller; 

use Soap\Model; 
use Zend\Soap\AutoDiscover as WsdlAutoDiscover; 
use Zend\Soap\Server as SoapServer; 
use Zend\Mvc\Controller\AbstractActionController; 

class SoapController extends AbstractActionController{ 

    private $env; 

    public function __construct(Model\Env $env){ 
     $this->env = $env; 
    } 

    public function wsdlAction(){ 
     /** @var \Zend\Http\Request $request */ 
     $request = $this->getRequest(); 

     if (!$request->isGet()) { 
      return $this->prepareClientErrorResponse('GET'); 
     } 

     $wsdl = new WsdlAutoDiscover(); 

     $wsdl = new WsdlAutoDiscover(); 
     $this->populateServer($wsdl); 

     /** @var \Zend\Http\Response $response */ 
     $response = $this->getResponse(); 
     $response->getHeaders()->addHeaderLine('Content-Type', 'application/wsdl+xml'); 
     $response->setContent($wsdl->toXml()); 
     return $response; 
    } 

    private function prepareClientErrorResponse($allowed){ 
     /** @var \Zend\Http\Response $response */ 
     $response = $this->getResponse(); 
     $response->setStatusCode(405); 
     $response->getHeaders()->addHeaderLine('Allow', $allowed); 
     return $response; 
    } 

    private function populateServer($server){ 
     // Expose a class and its methods: 
     $server->setClass(Model\Products::class); 

     // Expose an object instance and its methods: 
     $server->setObject($this->env); 

     // Expose a function: 
     $server->addFunction('Soap\Model\Env\ping'); 
     $server->addFunction('Soap\Model\Env\pong'); 
    } 

    public function serverAction(){ 
     /** @var \Zend\Http\Request $request */ 
     $request = $this->getRequest(); 

     if (!$request->isPost()) { 
      return $this->prepareClientErrorResponse('POST'); 
     } 

     // Create the server 
     $server = new SoapServer(
      $this->url() 
       ->fromRoute('soap/wsdl', [], ['force_canonical' => true]), 
      [ 
       'actor' => $this->url() 
        ->fromRoute('soap/server', [], ['force_canonical' => true]), 
      ] 
     ); 
     $server->setReturnResponse(true); 
     $this->populateServer($server); 

     $soapResponse = $server->handle($request->getContent()); 

     /** @var \Zend\Http\Response $response */ 
     $response = $this->getResponse(); 

     // Set the headers and content 
     $response->getHeaders()->addHeaderLine('Content-Type', 'application/soap+xml'); 
     $response->setContent($soapResponse); 
     return $response; 
    } 
} 

Nach dem Server ausgeführt Ich erhalte Fehler Call to undefined method Zend\Soap\AutoDiscover::setObject()

Als ich in Quelle Autoermittlung geprüft gibt es keine setObject, Welche Änderungen muss ich tun, um es zu beheben.

Antwort

0

Dies ist die populateServer Methode aus dem Link, den Sie geschrieben:

use Acme\Model; 

function populateServer($server, array $env) 
{ 
    // Expose a class and its methods: 
    $server->setClass(Model\Calculator::class); 

    // Or expose an object instance and its methods. 
    // However, this only works for Zend\Soap\Server, not AutoDiscover, so 
    // should not be used here. 
    // $server->setObject(new Model\Env($env)); 

    // Expose a function: 
    $server->addFunction('Acme\Model\ping'); 
} 

Und die Notiz knapp unter:

[...], wenn Sie Logik erstellen möchten, die neu sind -zwischen den Server- und AutoDiscover-Instanzen müssen Sie Ihre Verwendung auf setClass() beschränken. Wenn für diese Klasse Konstruktorargumente oder andere Möglichkeiten zum Festlegen des Instanzstatus erforderlich sind, sollten Sie die Logik für die Erstellung der WSDL über AutoDiscover und die Erstellung des Servers über den Server variieren.