123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166 |
- <?php
- /**
- * ShellCommand class file.
- *
- * @author Qiang Xue <qiang.xue@gmail.com>
- * @link http://www.yiiframework.com/
- * @copyright 2008-2013 Yii Software LLC
- * @license http://www.yiiframework.com/license/
- */
- /**
- * 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>
- * @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_=$this->createCommandRunner();
- $this->addCommands($_runner_);
- $_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;
- }
- }
- }
- /**
- * Creates a commands runner
- * @return CConsoleCommandRunner
- * @since 1.1.16
- */
- protected function createCommandRunner()
- {
- return new CConsoleCommandRunner;
- }
- /**
- * Adds commands to runner
- * @param CConsoleCommandRunner $runner
- * @since 1.1.16
- */
- protected function addCommands(CConsoleCommandRunner $runner)
- {
- $runner->addCommands(Yii::getPathOfAlias('system.cli.commands.shell'));
- $runner->addCommands(Yii::getPathOfAlias('application.commands.shell'));
- if(($_path_=@getenv('YIIC_SHELL_COMMAND_PATH'))!==false)
- $runner->addCommands($_path_);
- }
- }
- class ShellException extends CException
- {
- }
|