2012-08-23 49 views
3

我將ZfcUser設置爲認證模塊。該模塊的偉大工程,除了那我必須在每一個動作再次定義它的事實:ZF2,使用ZFCUser - >使用服務管理器

$sm = $this->getServiceLocator(); 
$auth = $sm->get('zfcuser_auth_service'); 
if ($auth->hasIdentity()) { 
    fb($auth->getIdentity()->getEmail()); 
} 
else return $this->redirect()->toRoute('zfcuser'); 

我試圖把代碼中的概念,但是沒有工作搞好。 然後我檢查了服務管理器,但無法正確定義所有出現的多個版本。

這是從我模塊類的代碼:

public function getServiceConfig() { 
    return array(
     'factories' => array(
      'Todo\Model\TodoTable' => function($sm) { 
       $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter'); 
       $table = new TodoTable($dbAdapter); 
       return $table; 
      }, 
     ), 
    ); 
} 

如何正確地做我安裝的服務?

回答

5

你考慮過一個控制器插件嗎?這將允許這六條線路被壓縮到一個呼叫。

否則另一種更通用的方法是創建一個附加'dispatch'事件的基本控制器。 Matthew Weier O'Phinney在「Events」標題下寫了一篇博文,展示了這種方法http://mwop.net/blog/2012-07-30-the-new-init.html

public function setEventManager(EventManagerInterface $events) 
{ 
    parent::setEventManager($events); 

    $controller = $this; 
    $events->attach('dispatch', function ($e) use ($controller) { 

     if (is_callable(array($controller, 'checkIdentity'))) 
     { 
      call_user_func(array($controller, 'checkIdentity')); 
     } 
    }, 100); 
} 


public function checkIdentity() 
{ 
    // Existing ZfcUser code 
}