2017-03-14 134 views
0

我試圖按照https://framework.zend.com/blog/2017-01-24-zend-soap-server.html教程安裝soap服務器。Zend Soap服務器示例

我相應的變化

<?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; 
    } 
} 

運行我收到提示 Call to undefined method Zend\Soap\AutoDiscover::setObject()

當我在自動發現的來源檢查,沒有的setObject服務器後,我該怎麼解決它有什麼變化。

回答

0

這是從您發佈的鏈接populateServer方法:

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'); 
} 

和NOTE僅低於:

[...]如果你想創建邏輯可以重新 - 在服務器和AutoDiscover實例之間使用,您必須將您的使用限制在setClass()。如果該類需要構造函數參數或其他設置實例狀態的方法,則應該通過AutoDiscover和通過服務器創建服務器來改變創建WSDL的邏輯。