如何在zf2中的自定义侦听器中注入服务定位器


How to inject service locator in a custom listener in zf2?

正如标题所说,我需要在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);
    }
}