Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 08-07-2008 22:58:08

JuTs
Membre
Date d'inscription: 07-03-2008
Messages: 63

Zend_Config et toArray()

Bonjour

Toujours dans mon exploration de ZF, je tente maintenant d'utiliser des fichiers de configuration (XML) pour gérer les rôles et les droit de mon application.

mon fichier xml est formé de la façon suivante :

Code:

<parameters>
    <!-- ... -->
    <acl>
        <roles>
            <role>
                <name>guide</name>
                <label>Guide</label>
                <permissions>2,0,1,5:5,0:6,0,1,2</permissions>
            </role>
            <role>
                <name>jbt</name>
                <label>JBT</label>
                <permissions>2,0</permissions>
            </role>
            <role>
                <name>resp_guides</name>
                <label>Responsable des guides</label>
                <permissions></permissions>
            </role>
        </roles>
               <!-- ... -->
      </acl>
</parameters>

à un moment j'ai dans mon code :

Code:

$roles = $params->acl->roles->toArray()

Ce qui me donne :

Code:

Array
(
    [role] => Array
        (
            [0] => Array
                (
                    [name] => guide
                    [label] => Guide
                    [permissions] => 2,0,1,5:5,0:6,0,1,2
                )

            [1] => Array
                (
                    [name] => jbt
                    [label] => JBT
                    [permissions] => 2,0
                )

            [2] => Array
                (
                    [name] => resp_guides
                    [label] => Responsable des guides
                    [permissions] => 
                )
        )
)

Jusque-là tout va bien.
Les problèmes surviennent lorsque je passe $roles dans une boucle foreach. Dans le cas du bout de xml indiqué plus haut tout est OK. Mais si dans mon XML je n'ai qu'un seul rôle, cela ne fonctionne plus. En effet, dans ce cas-là, $roles = $params->acl->roles->toArray() me retournerait le tableau suivant :

Code:

Array
(
    [role] => Array
        (
            [name] => guide
            [label] => Guide
            [permissions] => 2,0,1,5:5,0:6,0,1,2
        )

)

Il n'a évidemment plus la même structure que le premier. Y-a-t-il un moyen de gérer (avec ZF) ce genre de cas ? Je peux évidemment vérifier la structure de mon tableau avant de le passer à la boucle foreach mais je me demandais si ZF pourrait éventuellement avoir une méthode qui me serait utile dans ce cas-là


Julien

Hors ligne

 

#2 10-07-2008 13:49:09

JuTs
Membre
Date d'inscription: 07-03-2008
Messages: 63

Re: Zend_Config et toArray()

Personne ?


Julien

Hors ligne

 

#3 10-07-2008 14:24:37

-=blu3+3y3s=-
Membre
Lieu: Toulouse
Date d'inscription: 01-04-2008
Messages: 47

Re: Zend_Config et toArray()

Salut,
Est-ce que tu peux montrer le foreach que tu fais?

Hors ligne

 

#4 10-07-2008 17:22:58

JuTs
Membre
Date d'inscription: 07-03-2008
Messages: 63

Re: Zend_Config et toArray()

Code:

foreach($roles['role'] as $role) {
    // ...
}

mon but est que $role contienne quelque chose du genre :

Code:

Array
        (
            [name] => guide
            [label] => Guide
            [permissions] => 2,0,1,5:5,0:6,0,1,2
        )

ça fonctionne très bien si j'ai plusieurs balises <role> dans mon xml. Mais si j'en ai qu'un, $roles['role'] à déjà cette structure.


Julien

Hors ligne

 

#5 11-07-2008 10:39:54

JuTs
Membre
Date d'inscription: 07-03-2008
Messages: 63

Re: Zend_Config et toArray()

Je viens aussi de remarquer que je ne suis pas obligé de faire un toArray et que je peux passer l'objet Zend_Config dans le foreach.
Mais le problème se pose aussi dans ce cas-là.


Julien

Hors ligne

 

#6 13-07-2008 23:03:05

JuTs
Membre
Date d'inscription: 07-03-2008
Messages: 63

Re: Zend_Config et toArray()

Bon, j'ai écrit une classe fournissant une fonction permettant de "réinitialiser" la structure du tableau :

Code:

<?php

class MZ_Config_Tools {

    public static function resetLevels(array $config) {
        
        $root = current($config);
        $rootKey = key($config);
        $key = key($root);
        
        if (!is_int($key)) {
            $config = array();
            $config[$rootKey][0] = $root;
        }
        
        return $config;
    }
}

Exemple d'utilisation :

Code:

$roles = MZ_Config_Tools::resetLevels($params->acl->roles->toArray());

Ce qui permet d'obtenir :

Code:

Array
(
    [role] => Array
        (
            [0] => Array
                (
                    [name] => guide
                    [label] => Guide
                    [permissions] => 2,0,1,5:5,0:6,0,1,2
                )

        )

)

Et pas :

Code:

Array
(
    [role] => Array
        (
            [name] => guide
            [label] => Guide
            [permissions] => 2,0,1,5:5,0:6,0,1,2
        )

)

Je ne sais pas si la solution est parfaite mais dans les quelques cas qui me posent problème ça fonctionne

Dernière modification par JuTs (13-07-2008 23:05:23)


Julien

Hors ligne

 

#7 14-07-2008 09:37:32

Asfaloth
Membre
Lieu: Bruxelles
Date d'inscription: 13-05-2008
Messages: 83
Site web

Re: Zend_Config et toArray()

Etant spécialisé dans la creation d'intranet d'entreprise, je suis toujours interressé par les différentes méthodes de gestion d'acces à mes applications, et ta méthode m'intrigue un peu smile

Code:

            [permissions] => 2,0,1,5:5,0:6,0,1,2

Tu pourrais m'en dire plus ? ou me renvoyer vers de la doc qui parle de ce genre de gestion d'acces ?

Merci


La capacité d'apprendre est un don.
La faculté d'apprendre est un talent.
La volonté d'apprendre est un choix.
-=[ Frank Herbert ]=-

Hors ligne

 

#8 14-07-2008 10:19:47

sekaijin
Membre
Date d'inscription: 17-08-2007
Messages: 1137

Re: Zend_Config et toArray()

pour ma part j'utilise 3 fichiers
un fichier de paramètres les paramètres sont des éléments de configurations qui ne dépendent pas de la plate-forme sur la quelle est installé l'application.
un fichier de configuration les éléments de configuration eux sont ceux qui dépendent directement le la plate-forme.
un fichier environnement qui lui ne faire que dire quel est le nom des deux autres

je travaille en équipe et en général chaque développement fait l'objet d'au moins trois plate-formes le dev, la recette, la prod. le plus souvent il y a autant de plate-formes de dev que de développeurs la plate-forme de recette est là pour faire l'intégration et la recette elle est identique techniquement à la production.

c'est ce contexte qui nous a amené à gérer la conf de cette façon.
ainsi chacun peut avoir ces propres variables de configuration dépendant de sa plate-forme. le code étant partagé  le fait d'avoir un fichier de paramètre permet aussi de partager et de faire évoluer ceux-ci sans bloquer son voisin. (si on n'avait qu'un fichier on ne pourrait le partager car les conf sont différente pour chaque développeur. si on partageait un fichier sample.ini chaque évolution d'un paramètre nécessiterait que tout les developpeur le reportent dans leur fichier de conf. ainsi tout est automatique les paramètre sont partagé la config non)

du coup pour charger la config nous avons adapté Zend_Config à nos besoins
Fast/Config.php

Code:

<?php
/**
 * Configuration de Fast
 * 
 * La classe Fast_Config sert à charger les fichiers de configuration de l'application.
 * 
 * Il en existe au moins trois :
 * 
 *  1 - environement.ini qui donne le nom des deux autres. Il est obligatoirement nommé ainsi 
 *      ou doit être fourni lors du chargement de l'application. Cela permet d'avoir plusieurs 
 *         configurations en fonction de l'environnement dans lequel s'exécute l'application 
 *         (en développement ou en recette par exemple).
 *     2 - le fichier désigné par la clef d'environement contient tous les éléments dépendants des 
 *         configurations évoquées ci-dessus.
 *  3 - Le fichier désigné par la clef parameters défini les paramètres qui ne changent pas 
 *         lorsqu'on porte l'application sur une autre plateforme.
 * 
 * Les formats de fichier acceptés sont ini et xml (voir la doc Zend_Config).
 * 
 * @author Jean-Yves Terrien
 */

Zend_Loader::loadClass('Fast_Registry');

class Fast_Config
{
   /**
    *  @function load() charge toute la config en fonction du fichier environnement.
    * 
    * @param $environment String|null Nom du fichier d'environnement
    * @return Fast_Config le contenu du fichier désigné par la clef d'environnement.
    */
   public static function load($environment = null)
   {

      // Initialise une base de registre
      Zend_Registry::setClassName('Fast_Registry');
      
      if ($environment == null) {
         Zend_Loader::loadClass('Fast_Exception_Config');
         throw new Fast_Exception_Config(Fast_Exception_Config::UNDEFINED_ENVIRONMENT_FILE);
      }

      Fast_Registry::setConfigPath(str_replace(chr(92), '/', dirname($environment).'/'));
      // recherche un fichier de config déterminant l'environnement de travail.
      $config = Fast_Config::getFile('setEnvironment', $environment);

      if(!isset($config->main->environment)) {
         Zend_Loader::loadClass('Fast_Exception_Config');
         throw new Fast_Exception_Config(Fast_Exception_Config::UNDEFINED_ENVIRONMENT);
      } else {
        //Chemin et nom du fichier de config
          $environnementFile = Fast_Registry::getConfigPath().$config->main->environment;
      }

      if(!isset($config->main->parameters)) {
         Zend_Loader::loadClass('Fast_Exception_Config');
         throw new Fast_Exception_Config(Fast_Exception_Config::UNDEFINED_PARAMETERS);
      } else {
          //Chemin et nom du fichier de paramètres
         $parametersFile = Fast_Registry::getConfigPath().$config->main->parameters;
      }
      // Recherche un fichier de configuration générale de l'application.
      $config = Fast_Config::getFile('setConfiguration', $environnementFile);
      #Fast_Debug::show('$config', $config);
      
      // Recherche un fichier de paramètres généraux de l'application.
      $params = Fast_Config::getFile('setParameters', $parametersFile);

      // Mode de débuggage
      if (isset($params->fast->debug)) {
         // charge la classe de débugage
         Zend_Loader::loadClass('Fast_Debug');
         Fast_Debug::displayDebug($params->fast->debug);
      }
      // Affichage des erreurs
      $display_errors = $config->debug->get('display_errors', false);
      if (ini_get('display_errors') != $display_errors) {
         // pas d'ini_set inutile, c'est gourmand !
         ini_set('display_errors', $display_errors);
      }
      // Niveau d'erreur (ne pas les afficher n'empêche pas de les loguer)
      // avec un niveau raisonnable d'alarme par défaut en prod
      // Le niveau peut être indiqué avec des opérateurs (ex. E_ALL ^ E_STRICT)
      $error_reporting = $config->debug->get('error_reporting', E_WARNING);
      if (!is_numeric($error_reporting)) {
         eval("error_reporting($error_reporting);");
      } else {
         error_reporting($error_reporting);
      }
      return $config;
   } // end function load
   
   /**
   * @function _getConfigFileType() détermine le type du fichier en fonction de son extension.
   * @param $file String Nom du fichier
   * @return String type du fichier (ini ou xml)
   */
   private static function _getConfigFileType($file) {
      preg_match('/.*\.(.*)$/',$file, $maches);
      // le fichier de config généralerale peut être de type 'ini' ou 'xml'.
      if ((!isset($maches[1]))||(isset($maches[1])&&strtolower($maches[1]) != 'ini' && strtolower($maches[1]) != 'xml')) {
         Zend_Loader::loadClass('Fast_Exception_Config');
         throw new Fast_Exception_Config(Fast_Exception_Config::UNKNOW_FILE_TYPE. $file);
      }
      return ucfirst(strtolower($maches[1]));
   }

   /**
   * @function loadFile() charge un fichier de configuration
   * @param $filename String nom du fichier
   * @return Fast_Config contenu du fichier.
   */
   public static function loadFile($filename) {
      $type = Fast_Config::_getConfigFileType($filename);
      if (is_readable($filename)) {
         // lecture de toutes les sections du fichier de config à l'aide
         // de la classe de lecture appropriée.
         $configClass = "Zend_Config_" . $type;
         Zend_Loader::loadClass($configClass);
         $config = new $configClass($filename, null);
         return $config;
      } else {
         Zend_Loader::loadClass('Fast_Exception_Config');
         throw new Fast_Exception_Config(Fast_Exception_Config::UNAVAILABLE_FILE.$filename);
      }
   }

   /**
   * @function getFile() place le contenu du fichier dans la base de registre
   * @param $method String nom de la méthode d'enregistrement dans la base.
   * @param $filename String nom du fichier
   * @return Fast_Config contenu du fichier.
   */
   public static function getFile($method, $file) {
      $filename = realpath($file);
      $config = Fast_Config::loadFile($filename);
      Fast_Registry::$method($config);
      return $config;
   } 
}

Fast/Exception/Config.php

Code:

<?php
Zend_Loader::loadClass('Fast_Exception');
/**
 * Exception levée par la librairie Fast
 * Définit les exception de configuration de la library Fast
 * @see  Fast_Exception
 * @author Jean-Yves Terrien
 */
class Fast_Exception_Config extends Fast_Exception {
   const UNDEFINED_ENVIRONMENT = 'Undefined environment namespace';
   const UNDEFINED_PARAMETERS = 'Undefined parameters namespace';
   const UNKNOW_FILE_TYPE = 'Unknow file type: ';
   const UNAVAILABLE_FILE = 'Unanable to find file: ';
}

vous pouvez lire ceci pour plus de détail http://sekaijin.ovh.org/?p=7

en complément voici mes classes registry

Code:

<?php
/**
 * Fast_Registry est une base de registre amméliorée pour travailler confointement avec
 * Fast_Config ainsi les éléments de configuration des fichier environment config et parameters
 * se retrouve dans des espaces séparé dans la base de registre avec des methode d'accès spécifiques.
 *     
 */
Zend_Loader::loadClass('Zend_Registry');
class Fast_Registry extends Zend_Registry
{
   /* nom interne des section */
   const ENVIRONMENT_VARNAME = '_environment';
   const CONFIG_VARNAME      = '_configuration';
   const PARAMS_VARNAME      = '_parameters';
   const CONFIGPATH_VARNAME  = '_configpath';

   /**
      @function getEnvironment()  retourne la définition de l'environment
      @return Fast_Registry
   */
   public static function getEnvironment()
   {
      return parent::get(self::ENVIRONMENT_VARNAME);
   }

   /**
      @function setEnvironment()  définit de l'environment
      @param Misc $env config data
      @return Fast_Registry
   */
   public static function setEnvironment($env)
   {
      return parent::set(self::ENVIRONMENT_VARNAME, $env);
   }

   /**
      @function getConfiguration()  retourne la définition de la configuration
      @return Fast_Registry
   */
   public static function getConfiguration()
   {
      return parent::get(self::CONFIG_VARNAME);
   }

   /**
      @function setConfiguration()  définit la configuration
      @param Misc $config Misc config data
      @return Fast_Registry
   */
   public static function setConfiguration($config)
   {
      return parent::set(self::CONFIG_VARNAME, $config);
   }

   /**
      @function getParameters()  retourne la définition des parametres
      @return Fast_Registry
   */
   public static function getParameters()
   {
      return parent::get(self::PARAMS_VARNAME);
   }

   /**
      @function setParameters()  définit les parametres
      @param Misc $config config data
      @return Fast_Registry
   */
   public static function setParameters($config)
   {
      return parent::set(self::PARAMS_VARNAME, $config);
   }

   public static function getConfigPath()
   {
      return parent::get(self::CONFIGPATH_VARNAME);
   }

   public static function setConfigPath($path)
   {
      return parent::set(self::CONFIGPATH_VARNAME, $path);
   }

   /**
    * Assigne une valeur à une entrée (une clé) du registre.
    *
    * Cette méthode surcharge la méthode de base et vérifie la syntaxe
    * de la clé de registre.
    *
    * @param string $key L'entrée ne doit pas être préfixée de '_', ces
    *    entrées étant réservées aux traitements internes de la librairie Fast.
    * @param mixed $value
    */
   public static function set($key, $value)
   {
      if ('_' == substr($key, 0, 1)) {
         Zend_Loader::loadClass('Fast_Exception_Registry');
         throw new Fast_Exception_Registry(Fast_Exception_Registry::UNAUTHORIZED_PRIVATE_KEY . $key);
      }
      parent::set($key, $value);
   }

}

Code:

<?php
Zend_Loader::loadClass('Fast_Exception');
/**
 * Exception levée par la librairie Fast
 * Définit les exception de base de registre de la library Fast
 * @see  Fast_Exception
 * @author Jean-Yves Terrien
 */
class Fast_Exception_Registry extends Fast_Exception {
   const UNAUTHORIZED_PRIVATE_KEY = 'Unauthorized private key: ';
}

A+JYT

Dernière modification par sekaijin (14-07-2008 10:23:11)

Hors ligne

 

#9 14-07-2008 22:29:14

JuTs
Membre
Date d'inscription: 07-03-2008
Messages: 63

Re: Zend_Config et toArray()

Asfaloth a écrit:

Etant spécialisé dans la creation d'intranet d'entreprise, je suis toujours interressé par les différentes méthodes de gestion d'acces à mes applications, et ta méthode m'intrigue un peu smile

Code:

            [permissions] => 2,0,1,5:5,0:6,0,1,2

Tu pourrais m'en dire plus ? ou me renvoyer vers de la doc qui parle de ce genre de gestion d'acces ?

Merci

Mon but est de stocker la liste des rôles, resources, ... dans un fichier de configuration (XML ou Ini, au choix) afin de pouvoir réutiliser facilement les classes de gestion des droits dans plusieurs projet. Ainsi mon XML à la structure suivante :

Code:

<?xml version="1.0" encoding="UTF-8"?>
<parameters>
    <!-- ... -->
    <acl>
        <resources>
            <resource>
                <id>0</id>
                <controller>types</controller>
                <actions>
                    <action>
                        <id>0</id>
                        <name>index</name>
                    </action>
                    <action>
                        <id>1</id>
                        <name>ajouter</name>
                    </action>
                                       <action>
                        <id>2</id>
                        <name>supprimer</name>
                    </action>
                    ...
                </actions>
            </resource>

            <resource>
                <id>1</id>
                <module>utilisateurs</module>
                <controller>index</controller>
                <actions>
                    <action>
                        <id>0</id>
                        <name>index</name>
                    </action>
                    ....
                </actions>
            </resource>
        </resources>
                <roles>
            <role>
                <name>guide</name>
                <label>Guide</label>
                <permissions>2,0,1,5:5,0:6,0,1,2</permissions>
            </role>
        </roles>
    </acl>
</parameters>

la balise <acl> contient tout ce qui est lié à la gestion des droits

<resources> contient la liste des ressources de l'application

chaque resource est identifiée par un ID, le nom du controleur, éventuellement un module, et la liste de ses actions.
Chaque action est identifiée par un id et le nom de la fonction.

les balises <role> représentent les rôles. Ils contiennent leur nom, un label (que j'utiliserai dans l'interface de gestion des droits des utilisateurs). et la balise <permissions> contient les id des controlleurs et action de l'application

chaque groupe contrôleur/actions est séparé par ':' . ensuite, le premier chiffre de chaque "sous-chaîne" est l'id du contrôleur et ceux qui suivent ceux des actions.

ainsi, suivant l'exemple du bout de XML donné ci-dessus, 0,0,2:1,0 signifie que le rôle ayant ces permissions à les droit sur

types (controleur, id=0)
    index (id=0)
    supprimer (id=2)

utilisateur (contrôleur, id=1)
    index (id=0)



Voilà pour la gestion des droits.

Ensuite, je pense ajouter une possibilité de "réglage fin" des droits. les rôles c'est bien mais pas assez fin à mon goût. Par exemple imaginons un rôle "Rédacteur" qui aurais le droit d'ajouter/modifier/supprimer les articles d'un site. Que faire si par exemple je souhaite interdire la suppression à un utilisateur en particulier? Je pense résoudre cela en utilisant des Zend_Acl_Assert. Je n'ai pas encore essayé mais je pense que cela doit être possible.




@sekaijin : oui, j'ai suivi ton tuto pour la gestion des paramètres pour mon application. Merci

Dernière modification par JuTs (14-07-2008 22:31:07)


Julien

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