Use different enviroments (developmnet, production, etc) in your app with EASY Enviroment Class

You are viewing revision #2 of this wiki article.
This version may not be up to date with the latest version.
You may want to view the differences to the latest version.

next (#3) »

Hi, I was having problems each time I had to test the site or edit something on my local machine, like changing the db connection, change the debug mode to false, the trace level to 0, disable Gii, etc. So I created a class to resolve all my problems, hope to help you in your projects!

Instructions

  1. Configuring the Easy Enviroment class
  2. Configuring your index.php file
  3. Changing your enviroment
  4. Get your actual enviroment

Configuring the Easy Enviroment class

  1. Create a new file in the config folder, name it 'enviroment.php'.

  2. Paste the following code in your 'enviroment.php' file.

/**
     * This class helps you to config your Yii application
     * enviroment.
     * Any comments please post a message in the forum
     * Enjoy it!
     *
     * @name Enviroment
     * @author Fernando Torres | Marciano Studio
     * @version 1.0
     */
    
    class Enviroment {
    
        const DEVELOPMENT = 100;
        const TEST        = 200;
        const STAGE       = 300;
        const PRODUCTION  = 400;
    
        private $_mode = 0;
        private $_debug;
        private $_trace_level;
        private $_config;
    
    
        /**
         * Returns the debug mode
         * @return Bool
         */
        public function getDebug() {
            return $this->_debug;
        }
    
        /**
         * Returns the trace level for YII_TRACE_LEVEL
         * @return int
         */
        public function getTraceLevel() {
            return $this->_trace_level;
        }
    
        /**
         * Returns the configuration array depending on the mode
         * you choose
         * @return array
         */
        public function getConfig() {
            return $this->_config;
        }
    
    
        /**
         * Initilizes the Enviroment class with the given mode
         * @param constant $mode
         */
        function __construct($mode) {
            $this->_mode = $mode;
            $this->setConfig();
        }
    
        /**
         * Sets the configuration for the choosen enviroment
         * @param constant $mode
         */
        private function setConfig() {
            switch($this->_mode) {
                case self::DEVELOPMENT:
                    $this->_config      = array_merge_recursive ($this->_main(), $this->_development());
                    $this->_debug       = TRUE;
                    $this->_trace_level = 3;
                    break;
                case self::TEST:
                    $this->_config      = array_merge_recursive ($this->_main(), $this->_test());
                    $this->_debug       = FALSE;
                    $this->_trace_level = 0;
                    break;
                case self::STAGE:
                    $this->_config      = array_merge_recursive ($this->_main(), $this->_stage());
                    $this->_debug       = TRUE;
                    $this->_trace_level = 0;
                    break;
                case self::PRODUCTION:
                    $this->_config      = array_merge_recursive ($this->_main(), $this->_production());
                    $this->_debug       = FALSE;
                    $this->_trace_level = 0;
                    break;
                default:
                    $this->_config      = $this->_main();
                    $this->_debug       = TRUE;
                    $this->_trace_level = 0;
                    break;
            }
        }
    
    
        /**
         * Main configuration
         * This is the general configuration that uses all enviroments
         */
        private function _main() {
            return array(
    
                    // Base Path
                    'basePath' => dirname(__FILE__).DIRECTORY_SEPARATOR.'..',
    
                    // Project Name
                    'name' => 'Project name',
    
                    // Preloading 'log' component
                    'preload'=>array('log'),
    
                    // autoloading model and component classes
                    'import' => array(
                            'application.models.*',
                            'application.components.*',
                    ),
    
                    // Application components
                    'components' => array(
                            'user' => array(
                            // enable cookie-based authentication
                                    'allowAutoLogin'=>true
                            ),
    
                            // Error Handler
                            'errorHandler'=>array(
                                        'errorAction'=>'site/error',
                             ),
    
                            // URLs in path-format
                            'urlManager'=>array(
                                    'urlFormat'=>'path',
                                    'rules'=>array(
                                            '<controller:\w+>/<id:\d+>'=>'<controller>/view',
                                            '<controller:\w+>/<action:\w+>/<id:\d+>'=>'<controller>/<action>',
                                            '<controller:\w+>/<action:\w+>'=>'<controller>/<action>'
                                    ),
                            ),
                    ),
    
                    // Application-level parameters
                    'params'=>array(
                            'adminEmail'=>'admin@example.com',
                            'enviroment'=> $this->_mode
                    )
            );
        }
    
    
        /**
         * Development configuration
         * Usage:
         * - Local website
         * - Local DB
         * - Show all details on each error.
         * - Gii module enabled
         */
        private function _development () {
    
            return array(
    
                    // Modules
                    'modules'=>array(
                            'gii'=>array(
                                    'class'=>'system.gii.GiiModule',
                                    'password'=>'your password',
                                    'ipFilters'=>array(),
                                    'newFileMode'=>0666,
                                    'newDirMode'=>0777,
                            ),
                    ),
    
                    // Application components
                    'components' => array(
    
                            // Database
                            'db'=>array(
                                    'connectionString' => 'Your connection string to your local development server',
                                    'emulatePrepare' => false,
                                    'username' => 'admin',
                                    'password' => 'password',
                                    'charset' => 'utf8',
                            ),
    
                            // Application Log
                            'log'=>array(
                                    'class'=>'CLogRouter',
                                    'routes'=>array(
                                    // Save log messages on file
                                            array(
                                                    'class'=>'CFileLogRoute',
                                                    'levels'=>'error, warning,trace, info',
                                            ),
                                            // Show log messages on web pages
                                            array(
                                                    'class'=>'CWebLogRoute',
                                                    'levels'=>'error, warning, trace, info',
                                            ),
    
                                    ),
                            ),
                    ),
            );
        }
    
    
        /**
         * Test configuration
         * Usage:
         * - Local website
         * - Local DB
         * - Standard production error pages (404,500, etc.)
         * @var array
         */
        private function _test() {
            return array(
    
                    // Application components
                    'components' => array(
    
                            // Database
                            'db'=>array(
                                    'connectionString' => 'Your connection string to your local testing server',
                                    'emulatePrepare' => false,
                                    'username' => 'admin',
                                    'password' => 'password',
                                    'charset' => 'utf8',
                            ),
    
    
                            // Fixture Manager for testing
                            'fixture'=>array(
                                    'class'=>'system.test.CDbFixtureManager',
                            ),
    
                            // Application Log
                            'log'=>array(
                                    'class'=>'CLogRouter',
                                    'routes'=>array(
                                            array(
                                                    'class'=>'CFileLogRoute',
                                                    'levels'=>'error, warning,trace, info',
                                            ),
    
                                            // Show log messages on web pages
                                            array(
                                                    'class'=>'CWebLogRoute',
                                                    'levels'=>'error, warning',
                                            ),
                                    ),
                            ),
                    ),
            );
        }
    
        /**
         * Stage configuration
         * Usage:
         * - Online website
         * - Production DB
         * - All details on error
         */
        private function _stage() {
            return array(
    
                    // Application components
                    'components' => array(
                    // Database
                            'db'=>array(
                                    'connectionString' => 'Your connection string to your production server',
                                    'emulatePrepare' => false,
                                    'username' => 'admin',
                                    'password' => 'password',
                                    'charset' => 'utf8',
                            ),
    
                            // Application Log
                            'log'=>array(
                                    'class'=>'CLogRouter',
                                    'routes'=>array(
                                            array(
                                                    'class'=>'CFileLogRoute',
                                                    'levels'=>'error, warning, trace, info',
                                            ),
    
                                    ),
                            ),
                    ),
            );
        }
    
        /**
         * Production configuration
         * Usage:
         * - online website
         * - Production DB
         * - Standard production error pages (404,500, etc.)
         */
        private function _production() {
            return array(
    
                    // Application components
                    'components' => array(
    
                            // Database
                            'db'=>array(
                                    'connectionString' => 'Your connection string to your production server',
                                    'emulatePrepare' => false,
                                    'username' => 'admin',
                                    'password' => 'password',
                                    'charset' => 'utf8',
                            ),
    
    
                            // Application Log
                            'log'=>array(
                                    'class'=>'CLogRouter',
                                    'routes'=>array(
                                            array(
                                                    'class'=>'CFileLogRoute',
                                                    'levels'=>'error, warning',
                                            ),
    
                                            // Send errors via email to the system admin
                                            array(
                                                    'class'=>'CEmailLogRoute',
                                                    'levels'=>'error, warning',
                                                    'emails'=>'admin@example.com',
                                            ),
                                    ),
                            ),
                    ),
            );
        }
    }// END Enviroment Class

  1. Change the configuration for each enviroment:
    • DEVELOPMENT
    • TEST
    • STAGE
    • PRODUCTION

Configuring your index.php file

  1. Open your index.php file an replace all the code with the following code:*
// Change the following paths if necessary
    require_once(dirname(__FILE__).'/protected/config/enviroment.php');
    $enviroment = new Enviroment(Enviroment::DEVELOPMENT) ;
    
    $yii = dirname(__FILE__).'/../../framework/yii.php';
    
    defined('YII_DEBUG') or define('YII_DEBUG',$enviroment->getDebug());
    defined('YII_TRACE_LEVEL') or define('YII_TRACE_LEVEL', $enviroment->getTraceLevel());
    
    require_once($yii);
    Yii::createWebApplication($enviroment->getConfig())->run();

Changing your enviroment

  1. To change the enviroment just you have to change the following code:
//For development
    $enviroment = new Enviroment(Enviroment::DEVELOPMENT); 
    
    //For test
    $enviroment = new Enviroment(Enviroment::TEST); 
    
    //For stage
    $enviroment = new Enviroment(Enviroment::STAGE); 
    
    //For production
    $enviroment = new Enviroment(Enviroment::PRODUCTION); 

 

Get your actual enviroment

  1. You can check inside your application in what enviroment you are working with the following code:
// This will return the enviroment code number
    $currentEnviroment = Yii::app()->getParams()->enviroment;
    
    // Compare if the current enviroment is lower than production
    if($currentEnviroment < Enviroment::PRODUCTION){
       //Your code here...
    }else{
       //Your code here...
    }

Enjoy it! ;D

7 0
7 followers
Viewed: 76 542 times
Version: Unknown (update)
Category: Tutorials
Tags:
Written by: nancoder
Last updated by: marcovtwout
Created on: Jun 16, 2010
Last updated: 13 years ago
Update Article

Revisions

View all history