1

つまり、外部クラスからサービス マネージャー (ロケーター) にアクセスする必要があります。

詳細:

ZF2 プロジェクトに次の構造があります。

プロジェクト構造

Api.php は、コントローラーで作成された SOAP サーバーで使用するクラスです。

class IncomingInterfaceController extends AbstractActionController
{

    ...

    public function indexAction()
    {
        if (isset($_GET['wsdl']))
            $this->handleWSDL();
        else
            $this->handleSOAP();

        return $this->getResponse();
    }

    private function handleWSDL()
    {
        $autodiscover = new AutoDiscover();
        $autodiscover->setClass('\Application\Api\Api')->setUri($this->getURI());
        $autodiscover->handle();
    }

この Api.php クラスでは、サービスにアクセスする必要があります。

Api.php クラスで次のようなものが必要です。

public function OnNewDeal($uid)
{
     $error_log=$this->getServiceLocator()->get('error_log'); // this doesn't work!

     $error_log->write_error('error_text');
}
4

4 に答える 4

2

Module.php 内

public function getServiceConfig() {
    return array(
        'invokables' => array(
            'Application\Api\Api' => 'Application\Api\Api'           
        )
    );
}

Api.php で

class Api implements ServiceLocatorAwareInterface{

    protected $services;

    public function OnNewDeal($uid){
        $this->getServiceLocator()->get('error_log')->write_error('SOAP ERROR');
    }
    public function setServiceLocator(ServiceLocatorInterface $serviceLocator){
        $this->services = $serviceLocator;
    }

    public function getServiceLocator(){
        return $this->services;
    }
}

IncomingInterfaceController.php 内

class IncomingInterfaceController extends AbstractActionController{

    ...
    protected $api;

    public function indexAction()
    {
        if (isset($_GET['wsdl']))
            $this->handleWSDL();
        else
            $this->handleSOAP();

        return $this->getResponse();
    }

    private function handleWSDL()
    {
        $autodiscover = new AutoDiscover();
        $autodiscover->setClass('\Application\Api\Api')->setUri($this->getURI());
        $autodiscover->handle();
    }

    public getApi(){
        if(!$api){
            $this->api = $this->getServiceLocator()->get('Application\Api\Api');
        }
        return $this->api;
    }
于 2013-11-01T14:20:11.143 に答える
1

$this->handleSOAP(); を実行するコントローラーで setClassの代わりに、すでに作成されたインスタンスでsetObjectを使用します。

Api __construct $this->getServiceLocator()に渡して、そこで処理する必要があります。

class IncomingInterfaceController extends AbstractActionController
{
    private function handleSOAP()
    {
        $soap = new Server(null, array('wsdl'=>$this->getWSDLURI()));
        $soapClass = new \Application\Api\Api($this->getServiceLocator());
        $soap->setObject($soapClass);

        $soap->handle();
    }

Api クラスでは、serviceManager インスタンスを処理し、必要に応じて使用します。

class Api
{
    protected $serviceManager;
    public function __construct($serviceManager)
    {
        $this->serviceManager = $serviceManager;
    }

    public function OnNewDeal($uid)
    {
        $this->serviceManager->get('error_log')->write_error('SOAP ERROR');
    }
....
}
于 2013-11-01T13:43:59.903 に答える
1

おそらく、API は次のように ServiceLocatorAwareInterface を実装できます。

  class Api implements ServiceLocatorAwareInterface

そして追加

  class Api implements ServiceLocatorAwareInterface
  {
      protected $serviceManager;
  }

その後、サービスマネージャーが利用可能になります

更新しました

module.config.php の例

      <?php
      return array(
            'service_manager' => array(
                'factories' => array(
                      'Api' => 'Namespace\Api'
             ),
                'shared' => array(
                       'Api' => false
                )
            ),
       )
       ?>
于 2013-11-01T14:10:54.553 に答える