在zendframework 2中捕获登录事件

时间:2014-10-20 09:39:45

标签: event-handling zend-framework2 zfcuser

我想在zendframework2中捕获 loggin事件,然后在用户上次登录时更新数据库。

我知道如果我在我的模块的 onBootstrap(MVCEvent $ e)中执行以下操作,我将能够捕获事件等:

$eventManager = $e->getApplication()->getEventManager();
            $em           = $eventManager->getSharedManager();
            $em->attach(
                'ZfcUser\Authentication\Adapter\AdapterChain',
                'authenticate',
                function($e)
                {
                    $id = $e->getIdentity();

   }
            );

这将为我提供用户ID 。然而,困惑是我如何从引导程序更新我的数据库。我的意思是,我无法访问我的bootstrap中的实体管理器,我不知道如何在那里传输它。实体管理器保存在服务配置文件中。

即      getServiceConfig()

'Members\Model\WorkerTable' => function($sm) {
                    $db = $sm->get('doctrine.entitymanager.orm_default');
                    $table = new Model\MemberTable($db);
                    return $table;
                },   

通过上述设置,我可以访问 MemberTable类中的实体管理器

所以,一个简单的解决方案是将 loggin事件管理器转移到我的 ** MemberTable类**我将使用我的实体管理器来更新数据库。

问题,我不知道如何设置:

$eventManager = $e->getApplication()->getEventManager();
                $em           = $eventManager->getSharedManager();

我的意思是,我不知道如何将变量$ e加入 MemberTable类,以便我可以访问 eventManger 和sharedManager。

总结;问题是双重的。

  1. 如何让实体管理器进入引导功能
  2. 替代地

    1. 如何将eventManager和共享事件管理器放入普通类中,以便我可以在已包含实体管理器的类中调用eventmanger

1 个答案:

答案 0 :(得分:1)

好吧,您所要做的就是以这种方式检索服务管理器:

$serviceManager = $e->getApplication()->getServiceManager();

然后像这样得到你的实体经理:

$entityManager = $serviceManager->get('Members\Model\WorkerTable');

它能解决你的问题吗?

第二个问题的答案

要从外部将变量带入闭包,您可以使用“使用”运算符,如下所示:

function() use ($myVar){
    // some code
}

所以,在你的情况下我会这样做:

$eventManager = $e->getApplication()->getEventManager();
        $em = $eventManager->getSharedManager();
        $em->attach(
            'ZfcUser\Authentication\Adapter\AdapterChain',
            'authenticate',
            function($e) use ($entityManager){
                $id = $e->getIdentity();

            }
        );

如果你打算在你的闭包中有很多代码,我建议将它放入一个单独的类中并使其可以调用。例如,

class YourClosureCode
{
    private $entityManager;

    public function __construct($eventManager)
    {
        $this->eventManager = $eventManager;
    }

    public function __invoke(EventInterface $e)
    {
       // put your closure code here
    }
}

然后稍作修改:

 $eventManager = $e->getApplication()->getEventManager();
        $em = $eventManager->getSharedManager();
        $em->attach(
            'ZfcUser\Authentication\Adapter\AdapterChain',
            'authenticate',
            new YourClosureCode($entityManager);
        );