Mise en place d’une double-configuration automatique
Lors du développement d’un site CakePHP sur notre machine, nous devons configurer certains réglages spécifiques à notre environnement de développement. Ces réglages seront la plupart du temps différents sur l’espace d’hébergement en ligne lorsque le site sera terminé. Voyons comment gérer simplement une double-configuration développement / production avec CakePHP.
Cette astuce est utile pour gagner du temps lors de la mise à jour du site hébergé à partir du site local. Au lieu de devoir nous souvenir à chaque fois des fichiers qui sont ou non des fichiers de configuration, s’ils peuvent être écrasés sans crainte de dysfonctionnement du site en ligne, il nous suffit d’écraser tous les répertoires en ligne (sauf le fichier index.php du webroot) avec leurs alter ego locaux, et CakePHP sera toujours capable de choisir la bonne configuration.
1. Définition du critère de basculement automatique
Nous devons choisir un critère absolument sans ambiguïté à partir duquel CakePHP saura à coup sûr quelle configuration adopter. Un des critères qui différencie l’environnement local de développement du serveur d’hébergement est l’adresse IP à l’origine de la demande d’affichage une page. Sur la machine locale, cette adresse est 127.0.0.1, et en ligne cette adresse IP varie mais jamais ne peut être 127.0.0.1. Nous choisissons donc l’adresse IP comme critère de basculement automatique entre les deux configurations.
2. Identification de l’adresse IP
L’adresse IP à l’origine d’une requête http peut être connue en PHP grâce aux variables d’environnement. Comme cette adresse IP peut être retrouvée de plusieurs manières en PHP, nous allons plutôt utiliser une fonction de CakePHP pour déterminer l’IP : la fonction env(). Celle-ci va se charger à notre place de tester les différentes variables d’environnement de PHP susceptibles de contenir l’adresse IP.
3. Double configuration de la base de données
Nous allons mettre notre méthode en pratique en créant une double configuration pour la connexion à la base. Ouvrons le fichier {app}/config/database.php : il contient 2 tableaux associatifs, $default et $test. Nous renseignons $default avec les paramètres de connexion à la base de données en ligne, fournis par l’hébergeur lors de la commande de l’espace d’hébergement, et $test avec les paramètres de connexion à la base locale.
Il faut maintenant dire à CakePHP qu’il doit utiliser une configuration différente en fonction de l’adresse IP, et ce chaque fois qu’il appelera la base de données. Les échanges avec la base de données se font toujours dans la couche Modèle, mais nous ne voulons pas définir la configuration à utiliser pour chaque modèle de notre application, nous créons donc un nouveau fichier {app}/app_model.php qui va définir la classe AppModel, mère de toutes les classes de Modèle.
1 2 3 4 5 6 7 8 9 10 11 12 13 | class AppModel extends Model { function __construct($id=false, $table=null, $ds=null) { if(env('REMOTE_ADDR') == '127.0.0.1') { $this->useDbConfig = 'test'; } else { $this->useDbConfig = 'default'; } parent::__construct($id, $table, $ds); } } |
Nous redéfinissons le constructeur de la classe AppModel, en affectant à la variable useDbConfig une valeur différente en fonction de la valeur de l’adresse IP retournée par la fonction env(’REMOTE_ADDR’). Chaque modèle que nous créerons par la suite, héritant de ce nouveau constructeur, va ainsi savoir quels paramètres de connexion utiliser dans le fichier {app}/config/database.php.
Commentaires
6 avril 2008 à 19:06
Bonjour,
1) env(’REMOTE_ADDR’)
Je ne sais pourquoi, en testant sur la nightly du 04/04/2008, la fonction env() n’est pas reconnue. J’ai de mon côté fait la légère modif suivante :
$_SERVER["REMOTE_ADDR"], c’est une valeur sûre php-made
2) j’irais même encore plus loin dans la configuration.
En local ou sur hote distant, la racine n’est pas la même. Pour peu que vous ayez changé la disposition du core et du webroot sur votre serveur, et que vous travaillez dans des sous-sous-sous dossiers localement, il faut en plus configurer de la même manière le {webroot}/index.php :
if (!defined(’ROOT’))
{
if($_SERVER["REMOTE_ADDR"] == ‘127.0.0.1′)
{
define(’ROOT’, ‘C:\\wamp\\www\\foo\\apps’);
}
else
{
define(’ROOT’,'/home/user/foo/apps’);
}
}
et penser a faire de même pour APP_DIR et CAKE_CORE_INCLUDE_PATH .
Pour ma part, en faisant de cette façon, je n’ai plus aucun soucis lors des mises à jours et du changement de plateforme. J’ai créé un répertoire spécialement dédié aux updates, pour ne plus craindre les modifications non souhaitées et rétablir les paramètres rapidement.
30 juillet 2008 à 12:14
Bonjour
J’ai souvent vu cette méthode, mais je ne l’apprécie guère pour une simple raison : chaque requête d’un internaute entraîne un test if.
C’est une surcharge minime, mais je préfère gérer 2 fichiers de config (dev et prod) et faire le switch au moment de la mise en ligne.
Ça peut paraître plus compliqué, mais avec des outils comme Subversion, Ant, scripts, etc. le travail est complètement automatisé.
30 juillet 2008 à 13:06
Votre méthode est tout aussi valable, mais le temps de calcul induit par le if supplémentaire doit être absolument insignifiant, même inmesurable.
10 mars 2009 à 15:35
Salut !
Super tuto, seulement ça ne marche pas pour moi…
J’ai créé un projet tout neuf avec la dernière release CakePHP, copié collé le code indiqué dans le fichier indiqué (que j’ai créé). Il y a bien les 2 arrays dans mon database.php…
Là je ne vois pas, peut être une ré-écriture par dessus mon
qui le repasse en default ?
Si vous avez une idée ?
Merci bien…
Cordialement,
Thec
ps : super travail sur ce blog, merci beaucoup !
12 mars 2009 à 9:40
Merci !
Votre billet me tire une belle épine du pied !
Merci merci
4 mai 2009 à 20:41
Bonjour,
j’utilise la version 1.2.2.8120
et on dirait que le app_model.php a été déplacé et si je le mets dans mon dossier app il semble être ignoré…
Vous avez une idée pour aider un noob? thx
-F-