2017-03-14 16 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; 
    } 
} 

私は、自動検出のソースで確認すると何のsetObjectがないエラーに Call to undefined method Zend\Soap\AutoDiscover::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'); 
} 

そして、ちょうどその下の注:

を[...]あなたは、再できロジックを作成する場合 - ServerインスタンスとAutoDiscoverインスタンスの間で使用する場合は、使用方法をsetClass()に限定する必要があります。そのクラスでコンストラクタ引数やインスタンスの状態を設定するその他の方法が必要な場合は、AutoDiscoverを介してWSDLを作成するロジックを変更し、サーバー経由でサーバーを作成する必要があります。

関連する問題