Il existe au bas mot autant de manières de gérer la configuration d'une application qu'il y a de développeurs: fichier INI, variables, constantes, fichier XML, etc. Le composant Zend_Config développé par Rob Allen propose une approche simple et élégante basée sur un fichier INI qui permet de mettre en place aisément plusieurs environnements de configuration. Commençons par rappeler qu'un fichier INI s'écrit le plus simplement du monde en associant un nom de variable (composante gauche) à une valeur (composante droite) en leur interposant un signe d'égalité:

name = value

On peut également y ajouter des sections, qui permettent de structurer le fichier:

[database]
hostname = localhost
username = unprivilegieduser
password = someobscurepassword
database = mydatabase

Venons en au vif du sujet, l'utilisation proprement dite du sus-cité composant. N'y allons pas par quatre chemins, balançons directement un petit bout de code:

Zend::loadClass('Zend_Config');
Zend::loadClass('Zend_Config_Ini');

$config = new Zend_Config(Zend_Config_Ini::load('mon/fichier/ini', 'section'));

Rien de bien compliqué, on indique a Zend_Config_Ini un fichier INI à charger, et plus précisément quelle section de ce fichier nous interresse, puis il transmet les informations qui vont bien à Zend_Config, qui s'occupe de nous créer un bel objet de configuration. L'objet $config contient dès lors les valeurs du fichier INI comme autant de variables membres. Par exemple, si on utilise le fichier INI détaillé plus haut, on pourrait faire:

echo $config->username;

Ce qui afficherai unprivilegieduser. Simple non ? Simple, mais ne nous leurrons pas, ce n'est pas là l'usage que l'on fera de ce composant. En effet, quoi de plus rébarbatif que de devoir charger chaque section d'un fichier INI ? La vraie puissance de ce système réside dans le fait qu'il permet d'avoir des environnement de configuration séparés. Remanions légèrement notre fichier de configuration:

; Developement environement configuration
[dev]
db.hostname = localhost
db.username = unprivilegieduser
db.password = someobscurepassword
db.database = mydatabase

; Production configuration
[prod]
db.hostname = db.monsite.fr
db.username = someobscureuser
db.password = somereallyobscurepassword
db.database = mydatabase

Comme Zend_Config_Ini fait bien les choses, il analysera chaque nom de variable pour créer une arborescence d'objets en utilisant le . (point) comme séparateur. On aura ainsi:

$config = new Zend_Config(Zend_Config_Ini::load('./example.ini', 'dev'));
echo $config->db->username;

Il ne reste plus qu'a déterminer une manière de savoir quand on se trouve dans l'environnement de production ou dans celui de développement, il existe quelques méthodes pour cela:

  • un fichier .htaccess avec une directive SetEnv DEV 1, qui donnera la variable $_ENV['DEV'] dans le script
  • un test sur l'IP du serveur (IP locale, serveur de développement, IP publique pour le serveur de production)
  • un test sur la variable $_SERVER['HTTP_HOST'] (dev.monsite.fr, etc)

A titre personnel, j'utilise la solution du .htaccess, qui peut s'implémenter comme ça:

$section = isset($_ENV['DEV']) ? 'dev' : 'prod';
$config = new Zend_Config(Zend_Config_Ini::load('./example.ini', $section));

On peut bien entendu enregistrer notre instance de $config dans le Zend_Registry:

Zend::register('config', $config);

Ce qui nous permettra d'y avoir accès en toute simplicité par la suite:

$config = Zend::registry('config');

(Commentaires et Trackbacks sur PHP Mafia)