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.

Pierre-Emmanuel Fringant

Commentaires

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.

Participez