Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Bonjour,
j'ai un souci avec mon plugin controller.
Celui-ci verifie si le visiteur est logué et le renvoi sur le controller d'authentification si il ne l'est pas.
class Plugin_Auth extends Zend_Controller_Plugin_Abstract { public function preDispatch(Zend_Controller_Request_Abstract $request){ $auth = Zend_Auth::getInstance(); if(!$auth->hasIdentity()){ if($request->getControllerName() != 'auth'){ $this->_response->setRedirect('/auth/'); } } } }
le probleme est que sur mon controller index dans l'action index je retourne les informations de l'utilisateur connecté, et que lorsque je ne suis pas connecté et bien il me retourne une erreur (au lieu de me faire la redirection) ! Pourtant dans mon plugin j'utilise la fonction preDispatch qui a ce que j'ai compris execute le plugin avant l'accès au controller.
class IndexController extends Zend_Controller_Action { public function indexAction() { $login = Zend_Auth::getInstance()->getIdentity(); $this->view->read = $login->contact_id; $contactInfo = new Model_Contacts(); $contact = $contactInfo->getContact($login->contact_id); $entite = $contactInfo->getEntite($login->contact_id); $this->view->contact = $contact; $this->view->entite = $entite; } }
Merci pour votre aide
Dernière modification par jfrag (19-11-2009 16:37:52)
Hors ligne
et dans ton bootstrap tu as bien enregistré ton plugin ?
A+, Philippe
Hors ligne
Ouais il est defini dans mon fichier ini :
resources.frontController.plugins.auth = "Plugin_Auth"
Mais le problème ne viens pas de la il est bien executé mais après le controlleur !!?
Hors ligne
Forcément que c'est exécuter après.
Ta fonction setRedirect ne fait pas de redirection, elle place des valeurs dans des variables. C'est tout.
Tu dois forcer la redirection (et empêcher le dispatching de l'action demander) soit changer l'action demandé vers celle que tu veux exécuter (donc sans redirection)
Hors ligne
Merci Norky pour ton aide
mais par contre comment forcer la redirection pour empêcher le dispatching ??
Hors ligne
Je te conseil de passer par l'aide d'action 'redirector', tu as tous ce qu'il te faut dedans
Hors ligne
L'autre solution, c'est de ne pas faire de redirection (l'URL dans ton navigateur ne changera pas), par contre dans ton plugin, tu peux changer à la volée les modules/controllers/action appelés.
donc à la place de ta ligne :
$this->_response->setRedirect('/auth/');
tu peux mettre
$request->setModuleName("ton_module"); $request->setControllerName("auth"); $request->setActionName("ton_action");
A+, Philippe
Hors ligne
OK
Alors solutions possible :
1
utiliser setControllerName et setActionName qui permet de redefinir le controlleur et l'action avant le dispatch,
ce qui a pour but d'afficher la page du nouveau controlleur, par contre il ne change pas l'url
mais n'execute pas du tout le controlleur appelé a l'origine.
$request->setControllerName('nom'); $request->setActionName('action');
2
Utiliser le redirector :
$redirector = Zend_Controller_Action_HelperBroker::getStaticHelper('redirector'); $redirector->gotoUrl('/login/');
Charge le controlleur d'origine sans l'executer puis fait le redirect
temps de réponse des 2 solutions :
1 :
temps d'execution : 86ms
charge et execute 1 seul controlleur
2:
temps d'execution : 91ms + 93ms = 184ms
charge 2 controlleur est execute que celui dont l'url est passé.
je ne comprend pas le redirector lol
Hors ligne
Soit tu tapes très très vite, soit on s'est croisé
A+, Philippe
Hors ligne
Qu'est ce que tu ne comprends pas ?
Soit tu change l'action à exécuter,
Soit tu redirige avant d'exécuter (via l'aide redirector qui contient un exit si tu appelles la bonne fonction et donc n'exécute pas ton action). Tu peux même te placé en DispatchLoopStartup si l'envie de prends
Hors ligne
Enfin si j'ai compris mais bon je perd 100ms avec un redirector qui me mets une belle url
enfin bon ca fonctionne c'est le principal
Hors ligne
Il y a aussi un avantage à la première solution.
Dans ton formulaire d'identification, tu ne définis aucun lien pour l'attribut "action".
Ainsi, c'est la même URL qui sera appelée à la validation du formulaire. Mais comme tu n'es pas identifié à ce moment là, le controller sera encore redirigé vers le controller de login, où tu feras la vérification du formulaire.
De cette manière, tu rediriges vers la même URL si l'identification est correcte. Donc l'avantage est que lorsque qu'une page est demandée, l'utilisateur sera automatique redirigé vers celle-ci si son identification est validée.
Je sais, ça doit pas être clair
Hors ligne
oui c'est vrai Blount grace a la premiere solutions permettra de garder en memoire la page demandé et une fois logué retournera les resultat de la page. ca evite de faire des redirection
Hors ligne
Pages: 1