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

时间:2014-04-24 14:57:11

标签: php zend-framework2 service-locator

正如标题所说,我需要在zf2中的自定义侦听器中注入服务定位器,因为我需要在那里获得服务。

我在google和stackoverflow上搜索了2个小时,但一无所获,所以我敢问你。

有什么想法吗?

非常感谢你!

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);
    }
}