1

伙计们,在这一点上,我快要开始把头发从头上拔下来了。我找不到实现这一目标的方法。

我有一个自定义类,它属于我在 WebServices Module src 文件夹下创建的自定义文件夹。我需要能够从另一个模块/控制器内部实例化这个类,但是当我这样做并转储它包含 null 的服务成员时。我怎样才能从我的 ApiAuthentication 类中访问服务管理器。

任何帮助将不胜感激。谢谢

<?php

namespace WebServices\Services;

use Zend\ServiceManager\ServiceLocatorAwareInterface;
use Zend\ServiceManager\ServiceLocatorInterface;

class ApiAuthenticationService extends \Zend\Soap\Client implements ServiceLocatorAwareInterface{

    public $services;

    function __construct($options = null){

        parent::__construct('http://tinysoa.local/soap/security/api_authentication?wsdl',$options);

    }

    public function setServiceLocator(ServiceLocatorInterface $locator)
    {
        $this->services = $locator;
    }

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

}

当我从另一个模块/控制器内部调用它时,它会转储一个空值:

class IndexController extends AbstractActionController
{

       public function indexAction()
            {
                $a = new \WebServices\Services\ApiAuthenticationService();

                var_dump($a->services);
4

2 回答 2

5

用我自己对 Adrian's 附加组件的回答以及您在回答中提出的问题作出回应。

如果您的服务有它自己的依赖项,您只需使用工厂而不是走可调用路线。

假设您的服务需要一个缓存适配器和数据库适配器。还可以想象它可以选择配置一些其他服务(FooService,如下):

<?php
public function getServiceConfig()
{
    return array(
        'factories' => array(
            'my_service' => function($sm){
                $cache = $sm->get('Cache');
                $dbAdapter = $sm->get('DefaultDbAdapter');
                $fooService = $sm->get('FooService');

                // instantiate your service with required dependencies
                $mySvc = new \My\Shiny\Service($cache, $dbAdapter);

                // inject an optional dependency
                $mySvc->setFooService($fooService);

                // return your shiny new service
                return $mySvc;
            }
        )
    );
}

旁注:将 ServiceManager 注入各处通常是不好的设计。你最好更明确地管理你的依赖关系,就像上面一样。

如果您还没有阅读,那么快速入门中很好地介绍了这些内容。

于 2013-08-29T02:02:57.537 回答
1

在服务配置中注册您的服务并通过控制器中的 getServiceLocator() 方法访问它。

模块.php

public function getServiceConfig()
{
  return array(
    'invokables' => array(
        'my_service' => 'WebServices\Services\ApiAuthenticationService'
    )
  );
}

控制器

public function indexAction()
{
    $service = $this->getServiceLocator()->get('my_service');
}
于 2013-08-28T19:51:51.550 回答