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
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
Luc
jeu, 06/11/2008 - 09:26
Permalink
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 ?
Laurentj
jeu, 06/11/2008 - 12:23
Permalink
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 ;-)
Mat
jeu, 06/11/2008 - 12:54
Permalink
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.
Maxence
jeu, 06/11/2008 - 13:52
Permalink
Oui, effectivement c'est
Oui, effectivement c'est encore plus simple.
eyesfr
mar, 30/12/2008 - 12:39
Permalink
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').
:)