Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 30-09-2009 10:58:25

matdev
Membre
Date d'inscription: 31-03-2009
Messages: 172

[résolu]récupérer l'action dans le bootstrap

bonjour à tous
voilà ma question est peut-être bête mais je ne parviens pas à trouver la réponse
est-il possible de récupérer le nom du controller et de l'action courante dans le bootstrap et si oui comment?
merci d'avance

Dernière modification par matdev (30-09-2009 14:40:47)

Hors ligne

 

#2 30-09-2009 11:11:38

philippe
Administrateur
Lieu: Grenoble
Date d'inscription: 01-03-2007
Messages: 1624

Re: [résolu]récupérer l'action dans le bootstrap

Bonjour,

Dans le bootstrap non, c'est pas possible. Le routage n'a pas encore eu lieu.

Au plus tôt, tu peux récupérer ça dans un plugin après l'étape de routage. (Etapes 8 du schéma du tuto http://www.kitpages.fr/zf_helper_plugin.php).

A+, Philippe


twitter : @plv ; kitpages.fr : Création de sites internet à Grenoble et Paris

Hors ligne

 

#3 30-09-2009 11:36:51

matdev
Membre
Date d'inscription: 31-03-2009
Messages: 172

Re: [résolu]récupérer l'action dans le bootstrap

Ok je comprends bien le principe et le pourquoi du comment comme on dit.
je vais donc réorienter ma question.
au niveau du bootstrap, je définis mon acl en faisant appel à une classe située dans mes modèles, et-il possible au niveau de cette classe de récupérer l'action courante ?

Hors ligne

 

#4 30-09-2009 12:02:02

Phil
Membre
Lieu: Lyon
Date d'inscription: 10-10-2008
Messages: 58

Re: [résolu]récupérer l'action dans le bootstrap

Bonjour,
Je pense que tu devrais nous en dire un peu plus sur ton but avec les ACL..
Sinon je pense que tu devrais regarder les plugins de contrôleur, comme ca tu peut récupérer l'action et le contrôleur en pré-dispatch.. wink

Hors ligne

 

#5 30-09-2009 12:15:07

philippe
Administrateur
Lieu: Grenoble
Date d'inscription: 01-03-2007
Messages: 1624

Re: [résolu]récupérer l'action dans le bootstrap

@matdev :
ben non, toujours pas possible pas encore de routage.
Par contre tu peux définir tes acls dans un plugin, c'est ce que je fais dans mes codes.

A+, Philippe


twitter : @plv ; kitpages.fr : Création de sites internet à Grenoble et Paris

Hors ligne

 

#6 30-09-2009 14:11:27

matdev
Membre
Date d'inscription: 31-03-2009
Messages: 172

Re: [résolu]récupérer l'action dans le bootstrap

bon je vais vous donner un peu plus de détail
dans mon bootstrap, créé mes acl sauf si ils sont déjà créés et enregistrés en cache de la manière suivante:

Code:

//ACL | AUTH - Initialisation de la configuration liée à l'authentification et aux droits d'accès
$auth = Zend_Auth::getInstance();
$frontendOptions = array('lifetime' => 25200, 'automatic_serialization' => true);
$backendOptions = array();
// créer un objet Zend_Cache_Core
$cache = Zend_Cache::factory('Core','File',$frontendOptions,$backendOptions);
if($auth->hasIdentity())
{
    $identity=$auth->getIdentity();
       // on regarde si un cache existe déjà
    if(!$acl = $cache->load('aclcdl'.$identity->id)) {    
        // le cache est manquant, création de l'acl   
        $acl=new MyAcl($identity->Profils_designation);
        $cache->save($acl, 'aclcdl'.$identity->id);
    }
}
else
{
    // on regarde si un cache existe déjà
    if(!$acl = $cache->load('aclcdl')) {    
        // le cache est manquant, création de l'acl   
        $acl=new MyAcl("Visiteur");
        $cache->save($acl, 'aclcdl');
    }
}

le modele myacl gère mes autorisations en fonction du profil passé en paramètre et des droits enregistrés dans la base de données

Code:

<?php
class MyAcl extends Zend_Acl    {
    //constructeur
    public function __construct($role)    {
            $this->ajouterRoles($role);
    }
    
    public function ajouterRoles($role)
    {
           //Initialisation du role courant
           $this->addRole(new Zend_Acl_Role($role));
        //recupère l'identifiant du profil
        $profils=new Profils();
        $profil=$profils->fetchRow('designation="'.$role.'"');
        
        //création de la ressource authentification
           $this->add(new Zend_Acl_Resource(strtolower('Auth')));
           $this->add(new Zend_Acl_Resource('Auth'));
        //récupération des autres ressources
        $ressources=new Ressources();
        $ressources=$ressources->fetchAll('action is null or action="" or action=" "');
        foreach($ressources as $ressource)     {
                $this->add(new Zend_Acl_Resource(strtolower($ressource->controller)));
                $this->add(new Zend_Acl_Resource($ressource->controller));
        }
            
        //récupération des droits liés au profil
        $droits=new Droits();
           $droits=$droits->fetchAll('Profils_id='.$profil->id);
           foreach($droits as $droit)    {
               //cas des autorisations refusées
               if($droit->droit==0)  {
                   //si c'est un controleur
                if($droit->getRessources()->action==null || $droit->getRessources()->action=="" || $droit->getRessources()->action==" ")    {
                    $this->deny(
                        $droit->getProfils()->designation,//role
                        strtolower($droit->getRessources()->controller));//ressources (controleur)
                    $this->deny(
                        $droit->getProfils()->designation,//role
                        $droit->getRessources()->controller);//ressources (controleur)
                //si c'est une vue
                }else{
                    $this->deny(
                        $droit->getProfils()->designation,//role
                        strtolower($droit->getRessources()->controller),//ressources (controleur)
                        $droit->getRessources()->action);//ressources (action ou vue)
                    $this->deny(
                        $droit->getProfils()->designation,//role
                        $droit->getRessources()->controller,//ressources (controleur)
                        $droit->getRessources()->action);//ressources (action ou vue)
                }
            //cas des autorisations acceptées
            }else{
                if($droit->getRessources()->action==null || $droit->getRessources()->action=="" || $droit->getRessources()->action==" "){
                    $this->allow(
                        $droit->getProfils()->designation,
                        strtolower($droit->getRessources()->controller));
                    $this->allow(
                        $droit->getProfils()->designation,
                        $droit->getRessources()->controller);
                }else{
                    $this->allow(
                        $droit->getProfils()->designation,
                        strtolower($droit->getRessources()->controller),
                        $droit->getRessources()->action);
                    $this->allow(
                        $droit->getProfils()->designation,
                        $droit->getRessources()->controller,
                        $droit->getRessources()->action);
                }
               }
           }
           
           $this->allow(null,'Auth');
           $this->allow(null,'auth');
           
    }
}
?>

ensuite je controle mes autorisations à partir d'un plugin que je passe à la suite de ça dans le bootstrap

Code:

$frontController->registerPlugin(new MyPluginAuth($auth,$acl));

la raison de mon questionnement est le suivant, la création de mes acl est relativement longue en fonction du nombre de ressource que je traite dans mon application et je cherche à alléger tout ça ... je n'ai pas encore de réel idée sur comment m'y prendre mais j'essai de regrouper un max d'information et ainsi savoir ce que je peux utiliser ou non

je ne sais pas si je suis très clair :\

enfin merci pour les infos philippe

Hors ligne

 

#7 30-09-2009 14:40:26

matdev
Membre
Date d'inscription: 31-03-2009
Messages: 172

Re: [résolu]récupérer l'action dans le bootstrap

Bon en fait je cherchais compliquer avec les acl j'ai supprimé toute cette partie et j'ai simplement remanié mon plugin MyPluginAuth pour qu'il controle directement dans ma base de données si l'utilisateur peut accéder ou non à la ressource

autant simplifier le code et utiliser des choses simples plutot que des outils pas entièrement utiles et rallongeant les temps d'execution

merci pour vos info en tout cas

Hors ligne

 

#8 30-09-2009 15:19:55

philippe
Administrateur
Lieu: Grenoble
Date d'inscription: 01-03-2007
Messages: 1624

Re: [résolu]récupérer l'action dans le bootstrap

Je vais être insistant (une vraie tête de mule), mais la gestion du cache que tu faisais dans ton bootstrap, tu peux très bien le faire dans le routeShutdown d'un plugin. Cela dit si ta 2e méthode marche, ça simplifie effectivement les choses !

A+, Philippe


twitter : @plv ; kitpages.fr : Création de sites internet à Grenoble et Paris

Hors ligne

 

#9 01-10-2009 09:46:34

matdev
Membre
Date d'inscription: 31-03-2009
Messages: 172

Re: [résolu]récupérer l'action dans le bootstrap

Je suis entièrement d'accord avec toi philippe quant au positionnement de la mise en cache mais au final si on regarde ce que je faisais c'était de stocker la même chose deux fois (dans ma base de données et dans l'acl) or le traitement réalisé sur l'acl je peux aussi bien le faire directement avec la base.

De plus, lors de modification des droits dans la base, ceci seront directement pris en compte alors qu'avec l'acl et la mise en cache mon utilisateur devait se déconnecter et se reconnecter pour voir son profil mis à jour.

En tout cas merci pour tes réponses et tes informations, celà me sera certainement utile par la suite car je passe à une phase d'optimisation de mon application et je vais surement utiliser les plugins pour cela.

Dernière modification par matdev (01-10-2009 09:50:44)

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages