正如标题所说,我需要在zf2中的自定义侦听器中注入服务定位器,因为我需要在那里获得服务。
我在google和stackoverflow上搜索了2个小时,但一无所获,所以我敢问你。
有什么想法吗?
非常感谢你!
答案 0 :(得分:3)
你只需要让你的监听器实现'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;
}
然后,创建您的侦听器服务,如果您需要其他配置,它可以是Invokable或Factory。
'Path\To\MyListener' => new MyListener(),
Zend Framework现在将为您注入服务定位器。
答案 1 :(得分:1)
我认为更好的方法是使用工厂,不要在监听器内部提供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);
}
}