MigrateCommand class for multiple sites using one code base

0 0
2
Viewed: 8 195 times
Version: Unknown (update)
Category: How-tos
    Written by: Hudson Nguyen Hudson Nguyen
    Updated by: Hudson Nguyen Hudson Nguyen
    Created: Dec 10, 2012
    Updated: 13 years ago

    You are viewing revision #2 of this wiki article.
    This is the latest version of this article.
    You may want to see the changes made in this revision.

    « previous (#1)

    My CMS supports multiple sites using one code base therefore the db connection can only be configured by detecting the site's domain.

    As Yii's MigrateCommand class does not support a domain parameter and configuring the db connection in the console.php is impossible in this case, I have extended the MigrateCommand as below.

    class XMigrateCommand extends MigrateCommand
    {
        public $domain = '';
        protected $_db;
        
        public function beforeAction($action,$params)
        {
            if (in_array(strtolower($action),array('up','down','safeup','safedown','redo','to','new','history','mark')) && $this->domain == '')
            {
                echo 'You need to specify the domain as Xpress support multi-sites and multi-database.',"\n",'i.e: --domain=www.domain.com',"\n";
                return false;
            }
            
            return parent::beforeAction($action,$params);
        }
        
        protected function getDbConnection()
        {
            if($this->_db!==null)
                return $this->_db;
            else
            {        
                // environment file locates in /sites/env folder using this naming convention: config.domain.php
                $envFile = 'config.'.$this->domain.'.php';
                $envFile = Yii::app()->basePath.'/../sites/env/'.$envFile;
                if (file_exists($envFile))
                {
                    include ($envFile);
                    $db = $dbs['default'];
                    $this->_db = new CDbConnection($db['connectionString'],$db['username'],$db['password']);
                    return $this->_db;
                }
                else
                {
                    echo "Error: {$envFile} is not found. Invalid domain or this domain is not configured properly.";
                    exit(1);
                }
            }
    
            echo "Error: CMigrationCommand.connectionID '{$this->connectionID}' is invalid. Please make sure it refers to the ID of a CDbConnection application component.\n";
            exit(1);
        }
    }
    

    With this class, you can run migrate commands adding the --domain=... parameter. You will need to modify the code in getDbConnection to suite your need considering:

    • My env file is located in sites/env folder with this naming convention: config..php, i.e. config.abc.com.php
    • In the env file, there are many db connections defined. Each is a item of the $dbs[ ]
    $dbs['default']['connectionString'] = 'mysql:...';
    $dbs['default']['username'] = 'username';
    $dbs['default']['password'] = 'password';