Zend_Config

Zend_Config est très pratique pour lire les données de configuration enregistrées dans un fichier .ini. Il dispose notamment d'une méthode merge qui permet de surcharger des sections.

Par exemple, supposons que nous ayons le fichier ini suivant qui renferme les paramètres de connexion à nos bases de données. Sur une application Web classique, nous avons souvent besoin de 3 environnements : production, développement et test. Au lieu de répéter à chaque fois les mêmes informations, on peut créer une section globale dans laquelle on place les paramètres les plus utilisés, et 3 sections, une pour chaque environnement, qui surchargent ou définissent les paramètres spécifiques à l'environnement.

/application/config.ini

[common]
adapter = pdo_mysql
dbparams.host = localhost
dbparams.username = root
dbparams.password =
 
[dev]
dbparams.dbname = votreapp_dev
 
[prod]
dbparams.dbname = votreapp
dbparams.username = votreapp
dbparams.password = secret
 
[test]
dbparams.dbname = votreapp_test
Attention ce fichier ini ne doit pas être dans la racine de votre serveur Web car si ce dernier est mal configuré, il pourrait révéler le contenu de ce fichier et dévoiler vos mots de passe !

Dans notre plugin d'initialisation, on peut utiliser le code suivant pour récupérer la configuration spécifique à notre environnement.

/application/Initializer.php

<?php
[..]

// On charge la section commune. Le troisième paramètre autorise l'écriture.
$config = new Zend_Config_Ini('..application/config.ini''common'true);

// On charge la section spécifique (dev, prod ou test)
$localConfig = new Zend_Config_Ini($appDir '/config.ini'$env);

// On fusionne les deux configurations. Les paramètres de $localConfig écrasent ceux de $config. 
$config->merge($localConfig);

// On repasse $config en écriture seule.
$config->setReadOnly();

// On place l'objet dans le registre.
Zend_Registry::set('config'$config);

[..]
?>
Portrait de Luc

Bonjour, n'est-il pas

Bonjour,
n'est-il pas beaucoup plus simple d'utiliser les possibilités d'héritage de Zend_Config ?
On aurait donc le fichier /application/config.ini suivant :

[common]
adapter = pdo_mysql
dbparams.host = localhost
dbparams.username = root
dbparams.password =
 
[dev : common]
dbparams.dbname = votreapp_dev
 
[prod : common]
dbparams.dbname = votreapp
dbparams.username = votreapp
dbparams.password = secret
 
[test : common]
dbparams.dbname = votreapp_test

Et on le chargerait plus facilement et rapidement en une seule ligne :

// On charge la section que l'on veut. Le troisième paramètre autorise l'écriture.
$config = new Zend_Config_Ini('..application/config.ini', $env);
 
// On place l'objet dans le registre.
Zend_Registry::set('config', $config);
...

Qu'en pensez-vous ?

Portrait de Laurentj

jelix

Dans jelix aussi, on a la fusion des fichiers ini depuis bien longtemps. Pour l'édition gold, c'est même l'extension qui le fait, en bien plus rapide donc puisqu'elle utilise des routines internes de PHP... Et mieux même, la fusion renvoi un objet, et non un tableau, ce qui est plus confortable à utiliser ;-)

Portrait de Mat

alternative

Ah sympa je ne connaissais pas le merge.
Il est également possible de faire un héritage directement au niveau du fichier .ini
En reprenant ton exemple :

[common]
adapter = pdo_mysql
dbparams.host = localhost
dbparams.username = root
dbparams.password =
 
[dev : common]
dbparams.dbname = votreapp_dev
 
[prod : common]
dbparams.dbname = votreapp
dbparams.username = votreapp
dbparams.password = secret
 
[test : common]
dbparams.dbname = votreapp_test

Et coté PHP on peut directement charger la section voulue, qui héritera des paramètres de la section common.

Portrait de Maxence

Oui, effectivement c'est

Oui, effectivement c'est encore plus simple.

Portrait de eyesfr

Il me semble qu'il y a une

Il me semble qu'il y a une façon plus simple de faire...

[dev : common]

ensuite :

// On charge la section spécifique (dev, prod ou test)
$localConfig = new Zend_Config_Ini($appDir . '/config.ini', 'dev');

et c'est tout ('dev' etend 'commun').

:)

Poster un nouveau commentaire

Le contenu de ce champ ne sera pas montré publiquement. If you have a Gravatar account associated with the e-mail address you provide, it will be used to display your avatar.
  • Les adresses de pages web et de messagerie électronique sont transformées en liens automatiquement.
  • Allowed HTML tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Les lignes et les paragraphes vont à la ligne automatiquement.
  • You can enable syntax highlighting of source code with the following tags: <code>, <php>.

Plus d'informations sur les options de formatage

CAPTCHA
La vérification ne tient pas compte des minuscules ou des majuscules.
Image CAPTCHA
Enter the characters shown in the image.