Browse Source

console app cleanup.

tags/2.0.0-beta
Qiang Xue 12 years ago
parent
commit
5b357d2eed
  1. 63
      framework/console/Controller.php
  2. 377
      framework/console/controllers/MigrateController.php
  3. 149
      framework/console/controllers/ShellController.php

63
framework/console/Controller.php

@ -32,6 +32,12 @@ use yii\base\InvalidRouteException;
class Controller extends \yii\base\Controller
{
/**
* @var boolean whether the call of [[confirm()]] requires a user input.
* If false, [[confirm()]] will always return true no matter what user enters or not.
*/
public $interactive = true;
/**
* Runs an action with the specified action ID and parameters.
* If the action ID is empty, the method will use [[defaultAction]].
* @param string $id the ID of the action to be executed.
@ -80,43 +86,6 @@ class Controller extends \yii\base\Controller
}
/**
* Reads input via the readline PHP extension if that's available, or fgets() if readline is not installed.
*
* @param string $message to echo out before waiting for user input
* @param string $default the default string to be returned when user does not write anything.
* Defaults to null, means that default string is disabled.
* @return mixed line read as a string, or false if input has been closed
*/
public function prompt($message, $default = null)
{
if($default !== null) {
$message .= " [$default] ";
}
else {
$message .= ' ';
}
if(extension_loaded('readline')) {
$input = readline($message);
if($input !== false) {
readline_add_history($input);
}
}
else {
echo $message;
$input = fgets(STDIN);
}
if($input === false) {
return false;
}
else {
$input = trim($input);
return ($input === '' && $default !== null) ? $default : $input;
}
}
/**
* Asks user to confirm by typing y or n.
*
* @param string $message to echo out before waiting for user input
@ -125,9 +94,23 @@ class Controller extends \yii\base\Controller
*/
public function confirm($message, $default = false)
{
echo $message . ' (yes|no) [' . ($default ? 'yes' : 'no') . ']:';
if ($this->interactive) {
echo $message . ' (yes|no) [' . ($default ? 'yes' : 'no') . ']:';
$input = trim(fgets(STDIN));
return empty($input) ? $default : !strncasecmp($input, 'y', 1);
} else {
return true;
}
}
public function error($message)
{
echo "\nError: $message\n";
Yii::$application->end(1);
}
$input = trim(fgets(STDIN));
return empty($input) ? $default : !strncasecmp($input, 'y', 1);
public function globalOptions()
{
return array();
}
}

377
framework/console/controllers/MigrateController.php

@ -10,6 +10,7 @@
namespace yii\console\controllers;
use Yii;
use yii\console\Controller;
/**
@ -60,25 +61,25 @@ use yii\console\Controller;
*/
class MigrateController extends Controller
{
const BASE_MIGRATION='m000000_000000_base';
const BASE_MIGRATION = 'm000000_000000_base';
/**
* @var string the directory that stores the migrations. This must be specified
* in terms of a path alias, and the corresponding directory must exist.
* Defaults to 'application.migrations' (meaning 'protected/migrations').
*/
public $migrationPath='application.migrations';
public $migrationPath = '@application/migrations';
/**
* @var string the name of the table for keeping applied migration information.
* This table will be automatically created if not exists. Defaults to 'tbl_migration'.
* The table structure is: (version varchar(255) primary key, apply_time integer)
*/
public $migrationTable='tbl_migration';
public $migrationTable = 'tbl_migration';
/**
* @var string the application component ID that specifies the database connection for
* storing migration information. Defaults to 'db'.
*/
public $connectionID='db';
public $connectionID = 'db';
/**
* @var string the path of the template file for generating new migrations. This
* must be specified in terms of a path alias (e.g. application.migrations.template).
@ -88,23 +89,24 @@ class MigrateController extends Controller
/**
* @var string the default command action. It defaults to 'up'.
*/
public $defaultAction='up';
public $defaultAction = 'up';
/**
* @var boolean whether to execute the migration in an interactive mode. Defaults to true.
* Set this to false when performing migration in a cron job or background process.
*/
public $interactive=true;
public $interactive = true;
public function beforeAction($action)
{
$path = \Yii::getAlias($this->migrationPath);
if($path===false || !is_dir($path)) {
echo 'Error: The migration directory does not exist: ' . $this->migrationPath . "\n";
\Yii::$application->end(1);
$path = Yii::getAlias($this->migrationPath);
if ($path === false || !is_dir($path)) {
echo 'Error: the migration directory does not exist "' . $this->migrationPath . "\"\n";
return false;
}
$this->migrationPath=$path;
$this->migrationPath = $path;
$yiiVersion = \Yii::getVersion();
$yiiVersion = Yii::getVersion();
echo "\nYii Migration Tool v2.0 (based on Yii v{$yiiVersion})\n\n";
return parent::beforeAction($action);
@ -115,34 +117,32 @@ class MigrateController extends Controller
*/
public function actionUp($args)
{
if(($migrations = $this->getNewMigrations())===array())
{
if (($migrations = $this->getNewMigrations()) === array()) {
echo "No new migration found. Your system is up-to-date.\n";
\Yii::$application->end();
Yii::$application->end();
}
$total=count($migrations);
$step=isset($args[0]) ? (int)$args[0] : 0;
if($step>0) {
$migrations=array_slice($migrations,0,$step);
$total = count($migrations);
$step = isset($args[0]) ? (int)$args[0] : 0;
if ($step > 0) {
$migrations = array_slice($migrations, 0, $step);
}
$n=count($migrations);
if($n===$total)
echo "Total $n new ".($n===1 ? 'migration':'migrations')." to be applied:\n";
$n = count($migrations);
if ($n === $total)
echo "Total $n new " . ($n === 1 ? 'migration' : 'migrations') . " to be applied:\n";
else
echo "Total $n out of $total new ".($total===1 ? 'migration':'migrations')." to be applied:\n";
{
echo "Total $n out of $total new " . ($total === 1 ? 'migration' : 'migrations') . " to be applied:\n";
}
foreach($migrations as $migration)
foreach ($migrations as $migration)
echo " $migration\n";
echo "\n";
if($this->confirm('Apply the above '.($n===1 ? 'migration':'migrations')."?"))
{
foreach($migrations as $migration)
{
if($this->migrateUp($migration)===false)
{
if ($this->confirm('Apply the above ' . ($n === 1 ? 'migration' : 'migrations') . "?")) {
foreach ($migrations as $migration) {
if ($this->migrateUp($migration) === false) {
echo "\nMigration failed. All later migrations are canceled.\n";
return;
}
@ -153,29 +153,25 @@ class MigrateController extends Controller
public function actionDown($args)
{
$step=isset($args[0]) ? (int)$args[0] : 1;
if($step<1)
$step = isset($args[0]) ? (int)$args[0] : 1;
if ($step < 1)
die("Error: The step parameter must be greater than 0.\n");
if(($migrations=$this->getMigrationHistory($step))===array())
{
if (($migrations = $this->getMigrationHistory($step)) === array()) {
echo "No migration has been done before.\n";
return;
}
$migrations=array_keys($migrations);
$migrations = array_keys($migrations);
$n=count($migrations);
echo "Total $n ".($n===1 ? 'migration':'migrations')." to be reverted:\n";
foreach($migrations as $migration)
$n = count($migrations);
echo "Total $n " . ($n === 1 ? 'migration' : 'migrations') . " to be reverted:\n";
foreach ($migrations as $migration)
echo " $migration\n";
echo "\n";
if($this->confirm('Revert the above '.($n===1 ? 'migration':'migrations')."?"))
{
foreach($migrations as $migration)
{
if($this->migrateDown($migration)===false)
{
if ($this->confirm('Revert the above ' . ($n === 1 ? 'migration' : 'migrations') . "?")) {
foreach ($migrations as $migration) {
if ($this->migrateDown($migration) === false) {
echo "\nMigration failed. All later migrations are canceled.\n";
return;
}
@ -186,37 +182,31 @@ class MigrateController extends Controller
public function actionRedo($args)
{
$step=isset($args[0]) ? (int)$args[0] : 1;
if($step<1)
$step = isset($args[0]) ? (int)$args[0] : 1;
if ($step < 1)
die("Error: The step parameter must be greater than 0.\n");
if(($migrations=$this->getMigrationHistory($step))===array())
{
if (($migrations = $this->getMigrationHistory($step)) === array()) {
echo "No migration has been done before.\n";
return;
}
$migrations=array_keys($migrations);
$migrations = array_keys($migrations);
$n=count($migrations);
echo "Total $n ".($n===1 ? 'migration':'migrations')." to be redone:\n";
foreach($migrations as $migration)
$n = count($migrations);
echo "Total $n " . ($n === 1 ? 'migration' : 'migrations') . " to be redone:\n";
foreach ($migrations as $migration)
echo " $migration\n";
echo "\n";
if($this->confirm('Redo the above '.($n===1 ? 'migration':'migrations')."?"))
{
foreach($migrations as $migration)
{
if($this->migrateDown($migration)===false)
{
if ($this->confirm('Redo the above ' . ($n === 1 ? 'migration' : 'migrations') . "?")) {
foreach ($migrations as $migration) {
if ($this->migrateDown($migration) === false) {
echo "\nMigration failed. All later migrations are canceled.\n";
return;
}
}
foreach(array_reverse($migrations) as $migration)
{
if($this->migrateUp($migration)===false)
{
foreach (array_reverse($migrations) as $migration) {
if ($this->migrateUp($migration) === false) {
echo "\nMigration failed. All later migrations are canceled.\n";
return;
}
@ -227,35 +217,31 @@ class MigrateController extends Controller
public function actionTo($args)
{
if(isset($args[0]))
$version=$args[0];
if (isset($args[0]))
$version = $args[0];
else
$this->usageError('Please specify which version to migrate to.');
$originalVersion=$version;
if(preg_match('/^m?(\d{6}_\d{6})(_.*?)?$/',$version,$matches))
$version='m'.$matches[1];
$originalVersion = $version;
if (preg_match('/^m?(\d{6}_\d{6})(_.*?)?$/', $version, $matches))
$version = 'm' . $matches[1];
else
die("Error: The version option must be either a timestamp (e.g. 101129_185401)\nor the full name of a migration (e.g. m101129_185401_create_user_table).\n");
// try migrate up
$migrations=$this->getNewMigrations();
foreach($migrations as $i=>$migration)
{
if(strpos($migration,$version.'_')===0)
{
$this->actionUp(array($i+1));
$migrations = $this->getNewMigrations();
foreach ($migrations as $i => $migration) {
if (strpos($migration, $version . '_') === 0) {
$this->actionUp(array($i + 1));
return;
}
}
// try migrate down
$migrations=array_keys($this->getMigrationHistory(-1));
foreach($migrations as $i=>$migration)
{
if(strpos($migration,$version.'_')===0)
{
if($i===0)
$migrations = array_keys($this->getMigrationHistory(-1));
foreach ($migrations as $i => $migration) {
if (strpos($migration, $version . '_') === 0) {
if ($i === 0)
echo "Already at '$originalVersion'. Nothing needs to be done.\n";
else
$this->actionDown(array($i));
@ -268,32 +254,28 @@ class MigrateController extends Controller
public function actionMark($args)
{
if(isset($args[0]))
$version=$args[0];
if (isset($args[0]))
$version = $args[0];
else
$this->usageError('Please specify which version to mark to.');
$originalVersion=$version;
if(preg_match('/^m?(\d{6}_\d{6})(_.*?)?$/',$version,$matches))
$version='m'.$matches[1];
$originalVersion = $version;
if (preg_match('/^m?(\d{6}_\d{6})(_.*?)?$/', $version, $matches))
$version = 'm' . $matches[1];
else
die("Error: The version option must be either a timestamp (e.g. 101129_185401)\nor the full name of a migration (e.g. m101129_185401_create_user_table).\n");
$db=$this->getDb();
$db = $this->getDb();
// try mark up
$migrations=$this->getNewMigrations();
foreach($migrations as $i=>$migration)
{
if(strpos($migration,$version.'_')===0)
{
if($this->confirm("Set migration history at $originalVersion?"))
{
$command=$db->createCommand();
for($j=0;$j<=$i;++$j)
{
$migrations = $this->getNewMigrations();
foreach ($migrations as $i => $migration) {
if (strpos($migration, $version . '_') === 0) {
if ($this->confirm("Set migration history at $originalVersion?")) {
$command = $db->createCommand();
for ($j = 0; $j <= $i; ++$j) {
$command->insert($this->migrationTable, array(
'version'=>$migrations[$j],
'apply_time'=>time(),
'version' => $migrations[$j],
'apply_time' => time(),
));
}
echo "The migration history is set at $originalVersion.\nNo actual migration was performed.\n";
@ -303,20 +285,16 @@ class MigrateController extends Controller
}
// try mark down
$migrations=array_keys($this->getMigrationHistory(-1));
foreach($migrations as $i=>$migration)
{
if(strpos($migration,$version.'_')===0)
{
if($i===0)
$migrations = array_keys($this->getMigrationHistory(-1));
foreach ($migrations as $i => $migration) {
if (strpos($migration, $version . '_') === 0) {
if ($i === 0)
echo "Already at '$originalVersion'. Nothing needs to be done.\n";
else
{
if($this->confirm("Set migration history at $originalVersion?"))
{
$command=$db->createCommand();
for($j=0;$j<$i;++$j)
$command->delete($this->migrationTable, $db->quoteColumnName('version').'=:version', array(':version'=>$migrations[$j]));
else {
if ($this->confirm("Set migration history at $originalVersion?")) {
$command = $db->createCommand();
for ($j = 0; $j < $i; ++$j)
$command->delete($this->migrationTable, $db->quoteColumnName('version') . '=:version', array(':version' => $migrations[$j]));
echo "The migration history is set at $originalVersion.\nNo actual migration was performed.\n";
}
}
@ -329,125 +307,107 @@ class MigrateController extends Controller
public function actionHistory($args)
{
$limit=isset($args[0]) ? (int)$args[0] : -1;
$migrations=$this->getMigrationHistory($limit);
if($migrations===array())
$limit = isset($args[0]) ? (int)$args[0] : -1;
$migrations = $this->getMigrationHistory($limit);
if ($migrations === array())
echo "No migration has been done before.\n";
else
{
$n=count($migrations);
if($limit>0)
echo "Showing the last $n applied ".($n===1 ? 'migration' : 'migrations').":\n";
else {
$n = count($migrations);
if ($limit > 0)
echo "Showing the last $n applied " . ($n === 1 ? 'migration' : 'migrations') . ":\n";
else
echo "Total $n ".($n===1 ? 'migration has' : 'migrations have')." been applied before:\n";
foreach($migrations as $version=>$time)
echo " (".date('Y-m-d H:i:s',$time).') '.$version."\n";
echo "Total $n " . ($n === 1 ? 'migration has' : 'migrations have') . " been applied before:\n";
foreach ($migrations as $version => $time)
echo " (" . date('Y-m-d H:i:s', $time) . ') ' . $version . "\n";
}
}
public function actionNew($args)
{
$limit=isset($args[0]) ? (int)$args[0] : -1;
$migrations=$this->getNewMigrations();
if($migrations===array())
$limit = isset($args[0]) ? (int)$args[0] : -1;
$migrations = $this->getNewMigrations();
if ($migrations === array())
echo "No new migrations found. Your system is up-to-date.\n";
else
{
$n=count($migrations);
if($limit>0 && $n>$limit)
{
$migrations=array_slice($migrations,0,$limit);
echo "Showing $limit out of $n new ".($n===1 ? 'migration' : 'migrations').":\n";
}
else
echo "Found $n new ".($n===1 ? 'migration' : 'migrations').":\n";
foreach($migrations as $migration)
echo " ".$migration."\n";
else {
$n = count($migrations);
if ($limit > 0 && $n > $limit) {
$migrations = array_slice($migrations, 0, $limit);
echo "Showing $limit out of $n new " . ($n === 1 ? 'migration' : 'migrations') . ":\n";
} else
echo "Found $n new " . ($n === 1 ? 'migration' : 'migrations') . ":\n";
foreach ($migrations as $migration)
echo " " . $migration . "\n";
}
}
public function actionCreate($args)
{
if(isset($args[0]))
$name=$args[0];
if (isset($args[0]))
$name = $args[0];
else
$this->usageError('Please provide the name of the new migration.');
if(!preg_match('/^\w+$/',$name))
if (!preg_match('/^\w+$/', $name))
die("Error: The name of the migration must contain letters, digits and/or underscore characters only.\n");
$name='m'.gmdate('ymd_His').'_'.$name;
$content=strtr($this->getTemplate(), array('{ClassName}'=>$name));
$file=$this->migrationPath.DIRECTORY_SEPARATOR.$name.'.php';
$name = 'm' . gmdate('ymd_His') . '_' . $name;
$content = strtr($this->getTemplate(), array('{ClassName}' => $name));
$file = $this->migrationPath . DIRECTORY_SEPARATOR . $name . '.php';
if($this->confirm("Create new migration '$file'?"))
{
if ($this->confirm("Create new migration '$file'?")) {
file_put_contents($file, $content);
echo "New migration created successfully.\n";
}
}
public function confirm($message)
{
if(!$this->interactive)
return true;
return parent::confirm($message);
}
protected function migrateUp($class)
{
if($class===self::BASE_MIGRATION)
if ($class === self::BASE_MIGRATION)
return;
echo "*** applying $class\n";
$start=microtime(true);
$migration=$this->instantiateMigration($class);
if($migration->up()!==false)
{
$start = microtime(true);
$migration = $this->instantiateMigration($class);
if ($migration->up() !== false) {
$this->getDb()->createCommand()->insert($this->migrationTable, array(
'version'=>$class,
'apply_time'=>time(),
'version' => $class,
'apply_time' => time(),
));
$time=microtime(true)-$start;
echo "*** applied $class (time: ".sprintf("%.3f",$time)."s)\n\n";
}
else
{
$time=microtime(true)-$start;
echo "*** failed to apply $class (time: ".sprintf("%.3f",$time)."s)\n\n";
$time = microtime(true) - $start;
echo "*** applied $class (time: " . sprintf("%.3f", $time) . "s)\n\n";
} else {
$time = microtime(true) - $start;
echo "*** failed to apply $class (time: " . sprintf("%.3f", $time) . "s)\n\n";
return false;
}
}
protected function migrateDown($class)
{
if($class===self::BASE_MIGRATION)
if ($class === self::BASE_MIGRATION)
return;
echo "*** reverting $class\n";
$start=microtime(true);
$migration=$this->instantiateMigration($class);
if($migration->down()!==false)
{
$db=$this->getDb();
$db->createCommand()->delete($this->migrationTable, $db->quoteColumnName('version').'=:version', array(':version'=>$class));
$time=microtime(true)-$start;
echo "*** reverted $class (time: ".sprintf("%.3f",$time)."s)\n\n";
}
else
{
$time=microtime(true)-$start;
echo "*** failed to revert $class (time: ".sprintf("%.3f",$time)."s)\n\n";
$start = microtime(true);
$migration = $this->instantiateMigration($class);
if ($migration->down() !== false) {
$db = $this->getDb();
$db->createCommand()->delete($this->migrationTable, $db->quoteColumnName('version') . '=:version', array(':version' => $class));
$time = microtime(true) - $start;
echo "*** reverted $class (time: " . sprintf("%.3f", $time) . "s)\n\n";
} else {
$time = microtime(true) - $start;
echo "*** failed to revert $class (time: " . sprintf("%.3f", $time) . "s)\n\n";
return false;
}
}
protected function instantiateMigration($class)
{
$file=$this->migrationPath.DIRECTORY_SEPARATOR.$class.'.php';
$file = $this->migrationPath . DIRECTORY_SEPARATOR . $class . '.php';
require_once($file);
$migration=new $class;
$migration = new $class;
$migration->setDb($this->getDb());
return $migration;
}
@ -456,11 +416,12 @@ class MigrateController extends Controller
* @var CDbConnection
*/
private $_db;
protected function getDb()
{
if($this->_db!==null)
if ($this->_db !== null)
return $this->_db;
else if(($this->_db=\Yii::$application->getComponent($this->connectionID)) instanceof CDbConnection)
else if (($this->_db = Yii::$application->getComponent($this->connectionID)) instanceof CDbConnection)
return $this->_db;
else
die("Error: CMigrationCommand.connectionID '{$this->connectionID}' is invalid. Please make sure it refers to the ID of a CDbConnection application component.\n");
@ -468,9 +429,8 @@ class MigrateController extends Controller
protected function getMigrationHistory($limit)
{
$db=$this->getDb();
if($db->schema->getTable($this->migrationTable)===null)
{
$db = $this->getDb();
if ($db->schema->getTable($this->migrationTable) === null) {
$this->createMigrationHistoryTable();
}
return CHtml::listData($db->createCommand()
@ -483,34 +443,33 @@ class MigrateController extends Controller
protected function createMigrationHistoryTable()
{
$db=$this->getDb();
echo 'Creating migration history table "'.$this->migrationTable.'"...';
$db->createCommand()->createTable($this->migrationTable,array(
'version'=>'string NOT NULL PRIMARY KEY',
'apply_time'=>'integer',
$db = $this->getDb();
echo 'Creating migration history table "' . $this->migrationTable . '"...';
$db->createCommand()->createTable($this->migrationTable, array(
'version' => 'string NOT NULL PRIMARY KEY',
'apply_time' => 'integer',
));
$db->createCommand()->insert($this->migrationTable,array(
'version'=>self::BASE_MIGRATION,
'apply_time'=>time(),
$db->createCommand()->insert($this->migrationTable, array(
'version' => self::BASE_MIGRATION,
'apply_time' => time(),
));
echo "done.\n";
}
protected function getNewMigrations()
{
$applied=array();
foreach($this->getMigrationHistory(-1) as $version=>$time)
$applied[substr($version,1,13)]=true;
$migrations=array();
$handle=opendir($this->migrationPath);
while(($file=readdir($handle))!==false)
{
if($file==='.' || $file==='..')
$applied = array();
foreach ($this->getMigrationHistory(-1) as $version => $time)
$applied[substr($version, 1, 13)] = true;
$migrations = array();
$handle = opendir($this->migrationPath);
while (($file = readdir($handle)) !== false) {
if ($file === '.' || $file === '..')
continue;
$path=$this->migrationPath.DIRECTORY_SEPARATOR.$file;
if(preg_match('/^(m(\d{6}_\d{6})_.*?)\.php$/',$file,$matches) && is_file($path) && !isset($applied[$matches[2]]))
$migrations[]=$matches[1];
$path = $this->migrationPath . DIRECTORY_SEPARATOR . $file;
if (preg_match('/^(m(\d{6}_\d{6})_.*?)\.php$/', $file, $matches) && is_file($path) && !isset($applied[$matches[2]]))
$migrations[] = $matches[1];
}
closedir($handle);
sort($migrations);
@ -519,8 +478,8 @@ class MigrateController extends Controller
protected function getTemplate()
{
if($this->templateFile!==null)
return file_get_contents(Yii::getPathOfAlias($this->templateFile).'.php');
if ($this->templateFile !== null)
return file_get_contents(Yii::getPathOfAlias($this->templateFile) . '.php');
else
return <<<EOD
<?php

149
framework/console/controllers/ShellController.php

@ -1,149 +0,0 @@
<?php
/**
* ShellController class file.
*
* @author Qiang Xue <qiang.xue@gmail.com>
* @link http://www.yiiframework.com/
* @copyright Copyright &copy; 2008 Yii Software LLC
* @license http://www.yiiframework.com/license/
*/
namespace yii\console\controllers;
use yii\console\Controller;
/**
* This command executes the specified Web application and provides a shell for interaction.
*
* @property string $help The help information for the shell command.
*
* @author Qiang Xue <qiang.xue@gmail.com>
* @since 2.0
*/
class ShellController extends Controller
{
/**
* @return string the help information for the shell command
*/
public function getHelp()
{
return <<<EOD
USAGE
yiic shell [entry-script | config-file]
DESCRIPTION
This command allows you to interact with a Web application
on the command line. It also provides tools to automatically
generate new controllers, views and data models.
It is recommended that you execute this command under
the directory that contains the entry script file of
the Web application.
PARAMETERS
* entry-script | config-file: optional, the path to
the entry script file or the configuration file for
the Web application. If not given, it is assumed to be
the 'index.php' file under the current directory.
EOD;
}
/**
* Execute the action.
* @param array $args command line parameters specific for this command
*/
public function run($args)
{
if(!isset($args[0]))
$args[0]='index.php';
$entryScript=isset($args[0]) ? $args[0] : 'index.php';
if(($entryScript=realpath($args[0]))===false || !is_file($entryScript))
$this->usageError("{$args[0]} does not exist or is not an entry script file.");
// fake the web server setting
$cwd=getcwd();
chdir(dirname($entryScript));
$_SERVER['SCRIPT_NAME']='/'.basename($entryScript);
$_SERVER['REQUEST_URI']=$_SERVER['SCRIPT_NAME'];
$_SERVER['SCRIPT_FILENAME']=$entryScript;
$_SERVER['HTTP_HOST']='localhost';
$_SERVER['SERVER_NAME']='localhost';
$_SERVER['SERVER_PORT']=80;
// reset context to run the web application
restore_error_handler();
restore_exception_handler();
Yii::setApplication(null);
Yii::setPathOfAlias('application',null);
ob_start();
$config=require($entryScript);
ob_end_clean();
// oops, the entry script turns out to be a config file
if(is_array($config))
{
chdir($cwd);
$_SERVER['SCRIPT_NAME']='/index.php';
$_SERVER['REQUEST_URI']=$_SERVER['SCRIPT_NAME'];
$_SERVER['SCRIPT_FILENAME']=$cwd.DIRECTORY_SEPARATOR.'index.php';
Yii::createWebApplication($config);
}
restore_error_handler();
restore_exception_handler();
$yiiVersion=Yii::getVersion();
echo <<<EOD
Yii Interactive Tool v1.1 (based on Yii v{$yiiVersion})
Please type 'help' for help. Type 'exit' to quit.
EOD;
$this->runShell();
}
protected function runShell()
{
// disable E_NOTICE so that the shell is more friendly
error_reporting(E_ALL ^ E_NOTICE);
$_runner_=new CConsoleCommandRunner;
$_runner_->addCommands(dirname(__FILE__).'/shell');
$_runner_->addCommands(Yii::getPathOfAlias('application.commands.shell'));
if(($_path_=@getenv('YIIC_SHELL_COMMAND_PATH'))!==false)
$_runner_->addCommands($_path_);
$_commands_=$_runner_->commands;
$log=\Yii::$application->log;
while(($_line_=$this->prompt("\n>>"))!==false)
{
$_line_=trim($_line_);
if($_line_==='exit')
return;
try
{
$_args_=preg_split('/[\s,]+/',rtrim($_line_,';'),-1,PREG_SPLIT_NO_EMPTY);
if(isset($_args_[0]) && isset($_commands_[$_args_[0]]))
{
$_command_=$_runner_->createCommand($_args_[0]);
array_shift($_args_);
$_command_->init();
$_command_->run($_args_);
}
else
echo eval($_line_.';');
}
catch(Exception $e)
{
if($e instanceof ShellException)
echo $e->getMessage();
else
echo $e;
}
}
}
}
class ShellException extends CException
{
}
Loading…
Cancel
Save