2013-09-26 1 views
0

J'ai implémenté Zend Auth en créant un getServiceConfig() -comme AuthenticationService objet dans Module.php:Comment utiliser Zend Auth pour rendre les valeurs disponibles à l'échelle mondiale dans chaque action et layout.phtml

'AuthService' => function($sm) { 
        $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter'); 
        $dbTableAuthAdapter = new DbTableAuthAdapter($dbAdapter, 'tblUSRUsers', 'Email', 'Password', "MD5(?)"); 

        $authService = new AuthenticationService(); 
        $authService->setAdapter($dbTableAuthAdapter); 
        $authService->setStorage($sm->get('Application\Model\MyAuthStorage')); 

        return $authService; 
       }, 

Dans l'action du contrôleur, je suis obtenir cet objet par

$this->getServiceLocator() 
        ->get('AuthService'); 

Pour l'authentification j'obtenir les valeurs à l'aide

$authservice = $this->getServiceLocator()->get('AuthService'); 
$arrUserDetails = $authservice->getIdentity(); 

Cela fonctionne très bien, ces valeurs sont disponibles.

Mais le problème est que ServiceLocator n'est pas disponible dans le constructeur du contrôleur et ne peut donc pas écrire le code ci-dessus. Ecrire ce code dans chaque action ne semble pas être une bonne pratique. Quelqu'un peut-il m'aider?

Répondre

0

solution possible serait d'avoir un gestionnaire d'événements d'itinéraire, où vous définissez les informations d'identification de l'utilisateur:

class Module 
{ 
    public function onBootstrap(MvcEvent $e) 
    { 
     $eventManager = $e->getApplication() 
      ->getEventManager(); 

     $eventManager->attach (
      MvcEvent::EVENT_ROUTE, 
      function (MvcEvent $e) 
      { 
       $auth = $e->getApplication() 
          ->getServiceManager() 
          ->get('AuthService'); 

       $e->setParam('userinfo', $auth->getUserInfo()); 
       // update 
       $layout = $e->getViewModel(); 
       $layout->userinfo = $auth->getUserInfo();   
     }); 
    } 

et ensuite accéder ensuite dans le contrôleur comme ceci:

class IndexController extends AbstractActionController 
{ 
    public function indexAction() 
    { 
     $this->getEvent()->getParam('userinfo'); 
+0

Supposons que je doive passer le nom de l'utilisateur connecté à layout.phtml. Je veux définir cette information à travers le constructeur pour la mise en page. Mais, $ this-> getEvent() -> getParam ('userinfo'); n'est pas non plus disponible dans le constructeur. Donc, en me forçant à le mettre dans chaque action. – Bhuvi

+0

Si vous en avez besoin dans la mise en page, mettez-le là. Voir ma mise à jour – akond

+0

Merci. Je souhaite également rediriger l'utilisateur vers la page de connexion s'il n'est pas authentifié. Pour cela, j'écris if (! $ Auth-> hasIdentity()) { $ controller = $ e-> getTarget(); return $ controller-> plugin ('redirect') -> toRoute ('login'); } dans la fonction onBootstrap elle-même.Mais, il montre "Erreur fatale: Appel à la méthode non définie Zend \ Mvc \ Application :: redirect()" Pourriez-vous s'il vous plaît également spécifier comment cela peut être réalisé? – Bhuvi

0

Il y a plusieurs façons de le faire. Vous pouvez surcharger la méthode ControllerConfig dans la classe Module pour pouvoir instancier les contrôleurs comme bon vous semble. Ou vous pouvez écrire un plugin de contrôleur qui va gérer l'authentification & retourner l'identité.

EDIT

aurait dû fournir ces liens plus tôt, mais n'a pas eu un accès depuis le téléphone;). Pour connaître ControllerConfig, consultez this blog post. Il y a une explication à mi-chemin de la méthode getControllerConfig dans la classe Module. C'est une méthode que le gestionnaire de modules recherche lors de l'instanciation des classes Module, ce qui vous permet de personnaliser l'instanciation d'un contrôleur dans ce module. Une fois que vous avez renvoyé la classe Controller, le Controller Manager injecte ensuite le reste des dépendances du contrôleur (plugins, etc.)

Controller pluginsController plugins sont de petites classes qui sont injectées dans chaque contrôleur et qui peuvent être invoquées à partir d'une action commune peu de code. Lorsque vous utilisez $this->getServiceLocator() dans une action du contrôleur, vous utilisez un plugin.

+0

Je ne suis pas au courant de ces . Pourriez-vous s'il vous plaît expliquer en détail? – Bhuvi

+0

Voir ma modification. Vous pouvez également consulter https://github.com/ZF-Commons/ZfcUser et comment ils structurent leur classe Module. – Adrian

Questions connexes