You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
148 lines
3.8 KiB
148 lines
3.8 KiB
<?php |
|
/** |
|
* ShellCommand class file. |
|
* |
|
* @author Qiang Xue <qiang.xue@gmail.com> |
|
* @link http://www.yiiframework.com/ |
|
* @copyright Copyright © 2008-2011 Yii Software LLC |
|
* @license http://www.yiiframework.com/license/ |
|
* @version $Id$ |
|
*/ |
|
|
|
/** |
|
* ShellCommand 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> |
|
* @version $Id$ |
|
* @package system.cli.commands |
|
* @since 1.0 |
|
*/ |
|
class ShellCommand extends CConsoleCommand |
|
{ |
|
/** |
|
* @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::app()->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 |
|
{ |
|
} |