人, 在这一点上,我接近开始拔头发。我找不到实现这个目标的方法。
我有一个自定义类,属于我在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);
答案 0 :(得分: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通常是糟糕的设计。如上所述,您最好更明确地管理依赖项。
如果您还没有阅读过,Quick Start中的内容已经很好了。
答案 1 :(得分:1)
在Service Config中注册您的服务,并通过控制器中的getServiceLocator()方法访问它。
Module.php
public function getServiceConfig()
{
return array(
'invokables' => array(
'my_service' => 'WebServices\Services\ApiAuthenticationService'
)
);
}
控制器
public function indexAction()
{
$service = $this->getServiceLocator()->get('my_service');
}