MigrateCommand class for multiple sites using one code base

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';
0 0
2 followers
Viewed: 6 346 times
Version: 1.1
Category: How-tos
Tags:
Written by: Hudson Nguyen
Last updated by: Hudson Nguyen
Created on: Dec 10, 2012
Last updated: 11 years ago
Update Article

Revisions

View all history