Parce qu'il est parfois utile de pouvoir développer son application à partir de son serveur de dev et de le balancer sur son serveur de prod en quelques clics sans avoir à faire attention que les logs de la base soient les bons, que les niveaux de debug, sécurité, cookies soient les bons.

Je vous propose ce que j'ai réussi à faire à partir du taff des autres (), il sera toujours temps d'en discuter pour voir ce qui reste le plus optimal :

En premier lieu nous allons récupérer la classe de Rafael Bandeira qui va nous permettre de jouer avec des "environnements", la voila :

APP/Config/environment.php
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
/**
 * Singleton class to handle environment specific configurations.
 *
 * Auto-detect environment based on specific configured params and
 * allow per environment configuration and environment emulation.
 *
 * Environment. Smart Environment Handling.
 * Copyright 2008 Rafael Bandeira - rafaelbandeira3
 *
 * Licensed under The MIT License
 * Redistributions of files must retain the above copyright notice.
 */
class Environment {
 
	public $environments = array();
 
	protected $_configMap = array(
		'security' => 'Security.level'
	);
 
	protected $_paramMap = array(
		'server' => 'SERVER_NAME'
	);
 
	static function &getInstance() {
		static $instance = array();
		if (!isset($instance[0])) {
			$Environment = 'Environment';
			if (config('app_environment')) {
				$Environment = 'App' . $Environment;
			}
			$instance[0] = new $Environment();
			Configure::write('Environment.initialized', true);
		}
		return $instance[0];
	}
 
	static function configure($name, $params, $config = null) {
		$_this = Environment::getInstance();
		$_this->environments[$name] = compact('name', 'params', 'config');
	}
 
	static function start($environment = null) {
		$_this =& Environment::getInstance();
		$_this->setup($environment);
	}
 
	static function is($environment) {
		$_this =& Environment::getInstance();
		return ($_this->name === $environment);
	}
 
	public function __construct() {
		if (Configure::read('Environment.initialized')) {
			throw new Exception('Environment can only be initialized once');
			return false;
		}
	}
 
	public function setup($environment = null) {
		if (empty($environment)) {
			foreach ($this->environments as $environment => $config) {
				if ($this->_match($config['params'])) {
					break;
				}
			}
		}
		$config = array_merge(
			$this->environments[$environment]['config'],
			array('Environment.name' => $environment)
		);
		foreach ($config as $param => $value) {
			if (isset($this->_configMap[$param])) {
				$param = $this->_configMap[$param];
			}
			Configure::write($param, $value);
		}
	}
 
	protected function _match($params) {
		if ($params === true) {
			return true;
		}
		foreach ($params as $param => $value) {
			if (isset($this->_paramMap[$param])) {
				$param = $this->_paramMap[$param];
			}
			if (function_exists($param)) {
				$match = call_user_func($param, $value);
			} else {
				$match = (env($param) === $value);
			}
			if (!$match) {
				return false;
			}
		}
		return true;
	}
}
Cette classe va juste permettre de switcher les variables d'environnements, on pourrait allègrement faire plus léger mais pour l'instant on s'en contentera (on pourra l'alléger plus tard tant qu'à faire).
Vous allez la mettre dans un fichier environment.php que vous collerez dans le répertoire APP/Config

Nous allons créer un répertoire "environments" dans le répertoire APP/Config et y créer un fichier que vous nommerez : envs_list.php

Dans ce fameux fichier vous allez définir les environnements dont vous avez besoin (oui car nous sommes organisés)

APP/Config/environments/envs_list.php
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
<?php
 Environment::configure(
	'development'
	,array('server' => 'development')
	,array('debug' => 2, 'security' => 'low')
   );
   Environment::configure(
	'production'
	,array('server' => 'production')
	,array('debug' => 0, 'security' => 'high')
   );
Jusque la rien de grave, va falloir quand meme appeler les fameux fichier, donc dans le bootstrap.php nous allons ajouter les lignes suivantes :

APP/Config/Bootstrap.php
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
$configsDir    = APP . 'config' ;
$envsDir    = APP . 'config' . DS . 'environments';
$configFile = $configsDir . DS . 'environment.php';
$envsFile = $envsDir . DS . 'envs_list.php';
 
 
if ( file_exists( $configFile ) ){
   include_once( $configFile );
   if (file_exists( $envsFile )){
      include_once( $envsFile );
      Environment::start($_SERVER['APP_ENV']);      
   }
}
à cette étape il vous manque encore un tout petit truc mais très gênant si on ne le configure pas : la variable APP_ENV, nous allons la définir dans le .htaccess de plus haut niveau (à vrai dire vous pouvez le définir dans n'importe quel .htaccess seulement il faut le sortir le plus possible de la foule de répertoire afin de ne pas l'écraser lors des mises a jour des serveurs, sinon tout ceci perd de son intérêt)

.htaccess:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
SetEnv  APP_ENV "development"

Voila vous pouvez faire quelques test, tout devrait marcher, si vous avez page blanche , vérifiez bien les noms des environnements

Maintenant sachez qu'avec cette classe, vous ne pouvez pas switcher les configs de la base de données.

Nous allons donc modifier quelque peu le fichier database.php en lui ajoutant un petit switch , je vous montre la classe complète histoire que vous ne vous perdiez pas (j'ai piqué une partie de l'idée à Joel Moss)

APP/Config/database.php
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
class DATABASE_CONFIG {
 
   var $development = array(
		'driver' => 'mysql',
		'persistent' => false,
		'host' => 'localhost',
		'login' => 'login',
		'password' => 'pass',
		'database' => 'localhost',
		'prefix' => '',
		'encoding'=>'utf8'
		);
 
		var $production = array(
		'driver' => 'mysql',
		'persistent' => false,
		'host' => 'localhost',
		'login' => 'login_user',
		'password' => 'pass_pass',
		'database' => '192.168.1.200', //Un autre serveur quoi :)
		'prefix' => '',
		'encoding'=>'utf8'
		);
 
		var $default = array();
 
		function __construct()
		{     		      
		   if (isset($_SERVER['APP_ENV']))
		      $this->default = $this->$_SERVER['APP_ENV'];
		   else
		      $this->default = $this->developpement; //Mettez en une par défaut au cas ou
		}
		function DATABASE_CONFIG()
		{
		   $this->__construct();
		}
}
Et voila tout devrait fonctionner au poil, je laisse le topic a dispo pour toute améliorations , je pourrais éventuellement en faire un article si ça interesse les gens .

Testé en 1.2.5 stable, attention toutefois le fichier bootstrap.php est écrasé lors des mises à jour