正如标题所说,我需要在zf2中的自定义侦听器中注入服务定位器,因为我需要在那里获得服务。
我在谷歌和stackoverflow上搜索了两个小时,但一无所获,所以我敢问你。
有什么想法吗?
非常感谢!
您只需要让侦听器实现"ServiceLocatorAwareInterface",在服务类的顶部添加这个"use"块:
use Zend'ServiceManager'ServiceLocatorAwareInterface,
Zend'ServiceManager'ServiceLocatorInterface;
然后将以下属性和方法添加到类中
/**
* @var ServiceLocatorInterface
*/
protected $serviceManager;
/**
*
* @param ServiceLocatorInterface $serviceLocator
*/
public function setServiceLocator(ServiceLocatorInterface $serviceLocator)
{
$this->serviceManager = $serviceLocator;
}
/**
*
* @return 'Zend'ServiceManager'ServiceLocatorInterface
*/
public function getServiceLocator()
{
return $this->serviceManager;
}
然后,创建您的侦听器服务,如果您需要其他配置,它可以是可调用的或工厂。
'Path'To'MyListener' => new MyListener(),
ZendFramework现在将为您注入服务定位器。
我认为更好的方法是使用工厂,不要在监听器内部提供serivceManager。
class FooListenerFactory implements FactoryInterface
{
/**
* @param ServiceLocatorInterface $serviceLocator
* @return FooListener
*/
public function createService(ServiceLocatorInterface $serviceLocator)
{
/* @var $entityManager EntityManager */
$entityManager = $serviceLocator->get('what_u_need');
return new FooListener($entityManager);
}
}