我想在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。
总结;问题是双重的。
替代地
答案 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);
);