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);

[..]
?>

Commentaires

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 ?

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 ;-)

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.

Oui, effectivement c'est encore plus simple.

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').

:)

Ajouter un commentaire