jeudi 29 janvier 2009
Souvent quand on développe un site ou une application web, on a tendance à regrouper certaines variables de configuration à l'intérieur d'un fichier php qu'on inclut de façon globale au projet. On en arrive facilement à quelque chose comme ceci :
$mail_default_address = 'name@domain.com';Il n'est pas rare non plus d'avoir plus d'une configuration, par exemple en utiliser une en cours de développement et une différente en production. Lorsque ça arrive, on doit redéfinir nos variables, ne serait-ce que pour le temps d'implémenter une nouvelle fonctionnalité ou de vouloir reproduire un bogue dans le but de le corriger.
$mail_smtp = 'mail.domain.com';
$db_adapter = 'pdo_pgsql';
$db_host = 'domain.com';
$db_name = 'my_database_name';
$db_username = 'my_username';
$db_password = 'my_password';
// etc...
Le problème avec les variables ci-dessus est qu'il n'y a pas de lien logique qui les regroupe, ce qui peut causer un risque d'écrasement de la variable si une du même nom est réaffectée ailleurs dans le programme. Plusieurs programmeurs ont adapté leur configuration en regroupant les variables dans un tableau associatif contenu à l'intérieur d'une seule variable PHP. Pour reprendre l'exemple précédent, la même configuration aurait plutôt l'air de ceci :
$config = array(Encore là, c'est mieux mais il serait préférable que la configuration soit indépendante de l'application. Supposez que vous devez installer votre application chez un client et que vous voulez protéger votre code à l'aide de Zend Guard (ou d'un outil similaire). L'ensemble du code PHP sera transformé ("encodé") en code intermédiaire, y compris la configuration puisqu'elle fait partie du code PHP. D'où la nécessité de l'extraire.
'mail' => array(
'default_email' => 'name@domain.com',
'smtp' => 'mail.domain.com'
),
'database' => array(
'adapter' => 'pdo_pgsql',
'params' => array(
'host' => 'localhost',
'username' => 'my_username',
'password' => 'my_password',
'dbname' => 'my_database_name'
)
)
);
À l'intérieur du Zend Framework, il existe une classe qui se nomme Zend_Config qui permet de définir notre configuration dans un fichier .ini ou XML et de la charger par programmation. Le résultat sera un array associatif comme celui présenté plus haut, à l'exception que la configuration sera séparée du code source.
Par exemple, si on veut redéfinir notre configuration dans un fichier .ini :
; Configuration pour le site en productionUne fois le fichier .ini créé, on pourra le charger par PHP :
[production]
database.adapter = pdo_pgsql
database.params.host = domain.com
database.params.username = my_username
database.params.password = my_password
database.params.dbname = my_database_name
mail.default_email = name@domain.com
mail.smtp = mail.domain.com
; Redéfinition des valeurs pour le site en développement
; (autrement, on conserve celles de production)
[dev : production]
database.params.host = dev.localhost
database.params.username = my_dev_username
database.params.password = my_dev_password
database.params.dbname = my_database_name_for_tests
mail.default_email = programmer@dev-company.com
mail.smtp = mail.dev-company.com
require_once('Zend/Config.php');Encore une fois, le code est mieux structuré, plus facile à lire et à maintenir.
require_once('Zend/Config/Ini.php');
// on choisit la section "production" de la configuration
$config = new Zend_Config_Ini('/chemin/vers/config.ini', 'production');
// accès à une valeur
echo $config->database->params->host;
Quelques conseils :
- À la toute fin, n'oubliez pas de protéger l'accès à votre fichier .ini ou XML pour ne pas qu'il soit lisible en ligne!
- Dans un fichier .ini, si une valeur contient des caractères autres que alpha-numériques, placez la entre des guillemets ("").
- Utilisez Zend_Config_Writer pour exporter et enregistrer des configurations.
- Le format présenté dans le fichier .ini est recommandé par le Zend Framework puisqu'il permet d'instancier un objet Zend_Db automatiquement avec les clés définies.