Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Bonjour,
J'ai un petit soucis avec le Zend_Acl. Je suppose qu'il faut le stocker en session pour pouvoir tester les droits à chaque action, mais je n'y arrive pas. J'essaye en fait d'enregistrer l'Acl dans Zend_Registry, mais il refuse de l'enregistrer : quand je change de controller, il "oubli" mon index Acl...
Voilà, en gros, le code :
//dans Auth_Controller $data = $authAdapter->getResultRowObject(null,'g_u_pass'); Zend_Loader::loadClass('Models_MyAcl'); $oAcl=new Models_MyAcl(Zend_Registry::get('dbAdapter'), $data->g_u_id); Zend_Registry::set('acl', $oAcl);//Si je fait ici un print_r(Zend_Registry::get('acl')), c'est OK je vois l'Acl $this->_redirect('/general');
//Dans General_Controller if(Zend_Registry::get('acl')->isAllowed('curentUserRole','general_index_action')){ echo 'OK!'; }else{ echo 'NOK!'; }
J'ai l'erreur suivante à la ligne du "if" :
Fatal error: Uncaught exception 'Zend_Exception' with message 'No entry is registered for key 'acl'' in C:\wamp\php\includes\Zend\Registry.php:145 Stack trace: #0 C:\wamp\www\intralltub_general\default\ctrl\GeneralController.php(33): Zend_Registry::get('acl') #1 C:\wamp\php\includes\Zend\Controller\Action.php(497): GeneralController->indexAction() #2 C:\wamp\php\includes\Zend\Controller\Dispatcher\Standard.php(230): Zend_Controller_Action->dispatch('indexAction') #3 C:\wamp\php\includes\Zend\Controller\Front.php(889): Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http)) #4 C:\wamp\www\intralltub_general\index.php(96): Zend_Controller_Front->dispatch() #5 {main} thrown in C:\wamp\php\includes\Zend\Registry.php on line 145
Hors ligne
Bonjour haltabush,
Zend_Registry, c'est pas pour les sessions. Sa durée de vie est uniquement le temps d'une requête. (en gros, c'est des super variables globales).
Pour la session, va voir du coté de Zend_Session ou utilise directement $_SESSION.
A+, Philippe
Hors ligne
Ah?
Ca j'avais pas compris... Merci, je vais tester
Hors ligne
Ca marche mieux, mais c'est pas encore ça : voilà l'erreur retournée...
Fatal error: Uncaught exception 'PDOException' with message 'You cannot serialize or unserialize PDO instances' in C:\wamp\php\includes\Zend\Session.php:373 Stack trace: #0 [internal function]: PDO->__wakeup() #1 C:\wamp\php\includes\Zend\Session.php(373): session_start() #2 C:\wamp\php\includes\Zend\Session\Namespace.php(116): Zend_Session::start(true) #3 C:\wamp\php\includes\Zend\Auth\Storage\Session.php(85): Zend_Session_Namespace->__construct('Zend_Auth') #4 C:\wamp\php\includes\Zend\Auth.php(92): Zend_Auth_Storage_Session->__construct() #5 C:\wamp\php\includes\Zend\Auth.php(144): Zend_Auth->getStorage() #6 C:\wamp\www\intralltub_general\default\ctrl\AuthController.php(8): Zend_Auth->getIdentity() #7 C:\wamp\php\includes\Zend\Controller\Action.php(129): AuthController->init() #8 C:\wamp\php\includes\Zend\Controller\Dispatcher\Standard.php(209): Zend_Controller_Action->__construct(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http), Array) #9 C:\wamp\php\includes\Zend\Controller\Front.php(889): in C:\wamp\php\includes\Zend\Session.php on line 373 Fatal error: Exception thrown without a stack frame in Unknown on line 0
Je ne comrpends pas, je ne stocke pas d'instance de dbAdapter dans ma session... Je l'utilise pour générer mon Acl, mais c'est tout?
Voilà ma classe MyAcl, peut-être que vous verrez mieux que moi le problème.
<?php class Models_MyAcl extends Zend_Acl { public function __construct($db,$u_id) { parent::__construct(); $roleGuest = new Zend_Acl_Role('curentUserRole'); /*Zend_Loader::loadClass('Zend_Acl'); Zend_Loader::loadClass('Zend_Acl_Role'); Zend_Loader::loadClass('Zend_Acl_Resource');*/ $this->addRole(new Zend_Acl_Role('curentUserRole')); $select=$db->select(); $select->from('general_modules_actions', '*'); $select->join('general_droits2','g_m_a_id=g_d_m_a_id', '*'); $select->where($db->quoteInto('g_d_u_id=?',$u_id)); $result=$db->fetchAll($select); foreach($result as $ressource){ $this->add(new Zend_Acl_Resource($ressource['g_m_a_m_id'].'_'.$ressource['g_d_s_id'].'_'.$ressource['g_m_a_nom'])); $this->allow('curentUserRole', $ressource['g_m_a_m_id'].'_'.$ressource['g_d_s_id'].'_'.$ressource['g_m_a_nom']); } } }
Hors ligne
Re-bonjour,
Tu ne peux pas sauvegarder de connexion PDO en session (pour sauvegarder un objet en session, il faut qu'il soit sérialisable, ça n'est pas le cas de tous les objets). Par contre les Acl sont sérialisables normalement.
Philippe
Hors ligne
J'avais compris poru le PDO, mais là je ne vois pas où j'ai casé un PDO dans ma session? Je n'y stock qu'un objet MyAcl de la classe ci-dessus (en gros, un ACL classique mais généré en fonction des infos contenues dans la BD).
edit : ca ne pourrait pas être lié au fait que j'utiliser un session_namespace par defaut (Default) alors que j'utilise, par ailleurs, le Zend_Registry pour stocker mon dbAdapter?
Dernière modification par haltabush (11-06-2007 10:11:13)
Hors ligne
Je comprends de moins en moins... J'ai retiré la gestion de l'Acl et ça me renvoie toujours la même erreur, apprarement ça viendrait du Zend_Auth... je sens que de la fumée ne va pas tarder à me sortir par les oreilles...
Hors ligne
Zend_Auth sauvegarde le membre en session (pour ne pas faire de requêtes en base à chaque page). A priori, c'est le seul truc qu'il sauvegarde en session... (le 2e paramètre de new Zend_Auth_Result(...) ). Regarde si tu n'as pas un pointer PDO dedans...
A+, Philippe
Hors ligne
Ben non apparement... J'ai déjà regardé, je cherche encore en désespoir de cause :'(
Hors ligne
J'Y ARRIVE PO!!!!
J'enlève tout, il me fait une erreur dans l'init de chaque controller, au niveau de "Zend_Auth::getInstance()->getIdentity()"...
L'erreur, c'est toujours la même : PDOException...
Si vous avez la moindre piste, moi là je suis perdu : j'ai récupéré la nouvelle version du ZF au cas où, ca n'a rien changé, et j'ai retiré tout ce que je pouvais de mon code... HELP PLEASE!!!
edit : il suffit que je poste poru que ça remarche. Je comprend vraiment pas, là, d'autant que je n'ai strictement rien fait entre les 2 cas...
re edit : je crois que j'ai compris En fait, mon erreur venait de ma classe My_Acl : je mettais en attribut un dbAdapter, et donc il était impossible de sérialiser mon objet. Ca, j'avais vaguement compris. En revanche, quand on recharge la page, dès qu'il utilise des sessions il doit recharger le tout, donc il indique une erreur partout où il y a un session_start. Pas franchement pratique pour le debuggage... Je pense pas être clair, mais bon je me comprend
Dernière modification par haltabush (11-06-2007 15:10:43)
Hors ligne
Pages: 1