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.
		
		
		
		
		
			
		
			
				
					
					
						
							149 lines
						
					
					
						
							3.8 KiB
						
					
					
				
			
		
		
	
	
							149 lines
						
					
					
						
							3.8 KiB
						
					
					
				<?php | 
						|
/** | 
						|
 * ShellController class file. | 
						|
 * | 
						|
 * @author Qiang Xue <qiang.xue@gmail.com> | 
						|
 * @link http://www.yiiframework.com/ | 
						|
 * @copyright Copyright © 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 | 
						|
{ | 
						|
} |