summaryrefslogtreecommitdiff
path: root/framework/cli/commands/ShellCommand.php
diff options
context:
space:
mode:
Diffstat (limited to 'framework/cli/commands/ShellCommand.php')
-rw-r--r--framework/cli/commands/ShellCommand.php148
1 files changed, 148 insertions, 0 deletions
diff --git a/framework/cli/commands/ShellCommand.php b/framework/cli/commands/ShellCommand.php
new file mode 100644
index 0000000..e90d9bf
--- /dev/null
+++ b/framework/cli/commands/ShellCommand.php
@@ -0,0 +1,148 @@
+<?php
+/**
+ * ShellCommand class file.
+ *
+ * @author Qiang Xue <qiang.xue@gmail.com>
+ * @link http://www.yiiframework.com/
+ * @copyright Copyright &copy; 2008-2011 Yii Software LLC
+ * @license http://www.yiiframework.com/license/
+ * @version $Id: ShellCommand.php 3477 2011-12-06 22:33:37Z alexander.makarow $
+ */
+
+/**
+ * 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: ShellCommand.php 3477 2011-12-06 22:33:37Z alexander.makarow $
+ * @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
+{
+} \ No newline at end of file