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 |
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; } } |
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 |
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') ); |
APP/Config/Bootstrap.php
Code : | Sélectionner tout |
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']); } } |
.htaccess:
Code : | Sélectionner tout |
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 |
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(); } } |
Testé en 1.2.5 stable, attention toutefois le fichier bootstrap.php est écrasé lors des mises à jour