2014-10-20 59 views
0

我想捕捉的洛事件在zendframework2,然後更新數據庫,當用戶在上次登錄。捕獲登錄事件zendframework 2

我知道,如果我做的以下onBootstrap我的模塊(MVCEvent $ E)我將能夠捕獲事件等:

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

    } 
      ); 

這會給我的用戶的標識。然而,混亂是我可以從bootstrap更新我的數據庫。我的意思是,我沒有訪問實體經理在我的bootstrap中,我不知道如何在那裏運輸它。實體管理器保存在服務配置文件中。

即 getServiceConfig()

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

經過以上設置後,我能夠訪問該實體管理器在我MemberTable類

所以,一個簡單的解決方案是將洛事件管理轉移到我的 ** MemberTable類**我將使用我的實體管理器來更新數據庫。

問題,我不知道該如何設置了:

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

我的意思是,我不知道如何讓變量$ e取入MemberTable類,這樣我可以訪問eventManger和sharedManager。

總結;這個問題是雙重的。

  1. 如何獲得實體管理器到自舉功能

替代地

  • 如何獲得的eventmanager進行和共享eventmanager進行到一個普通的類所以我可以在已經包含實體管理器的類中調用事件管理器
  • 回答

    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); 
         ); 
    
    +0

    喜下一步開發。好想法。謝謝你。它幫助我將實體管理器引入引導程序。但是我怎麼才能讓實體管理者進入封閉。我已更新我的問題以顯示問題 – 2014-10-20 12:32:21

    +0

    我已更新回答 – 2014-10-20 12:47:14

    +0

    啊。我明白。讓我試試吧。謝謝Next Developer坦克 – 2014-10-20 13:10:06