在事件监听器zend框架2中获取服务管理器实例

时间:2013-08-23 06:06:29

标签: php events zend-framework2

我有一个带有findAll()函数的mapper类“User”。

public function findAll()
 {        
  /**
  * Fetch records from table 'User'

  *@author Administrator
  */

    $this->getEventManager()->trigger('find', $this, array('entity' => $entity));
    return $entity;

}

这里我正在触发一个用户模块类

监听的事件
public function onBootstrap(MvcEvent $event)
{

    $eventManager       = $event->getApplication()->getEventManager();
    $sharedEventManager = $eventManager->getSharedManager();

    $sm = $event->getApplication()->getServiceManager();


    $sharedEventManager->attach('ZfcUser\Mapper\User', 'find', function($e) {

         /*
          Access log create object
         */

    }, 100);

}

我真的希望将日志记录添加到数据库中,我准备了一个服务来返回一个能够将此记录写入DB的对象。

public function getServiceConfig() {
    return array(
        'factories' => array(
               'Dblogger' => function($sm) {

                $logger = $sm->get('logger');
                $plugin = new Controller\Plugin\Log;
                $plugin->setLogger($logger);
                return $plugin;
            },
        ),
    );
}

使用此服务,我所要做的就是调用此方法

$sm = $event->getApplication()->getServiceManager();
$logger = $sm->get('Dblogger');
$logger->Debug('View the user list');

但我的问题是,无论如何都无法在此闭包函数中调用此服务

 $sharedEventManager->attach('ZfcUser\Mapper\User', 'find', function($e) {

         /*
          Access log create object
         */

    }, 100);

请帮我解决问题

2 个答案:

答案 0 :(得分:3)

public function onBootstrap(MvcEvent $event)
{

    $eventManager       = $event->getApplication()->getEventManager();
    $sharedEventManager = $eventManager->getSharedManager();

    $sm = $event->getApplication()->getServiceManager();


    $sharedEventManager->attach('ZfcUser\Mapper\User', 'find', function($e) use ($sm) {

         /*
          Access log create object
         */
         $sm->....

    }, 100);

}

答案 1 :(得分:1)

可能有一个更清洁的解决方案,但我只是use

$sEM->attach('Namespace', 'eventName', function(Event $e) use ($serviceManager) {
    $serviceManager->get('fooBar');
});