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.
181 lines
5.4 KiB
181 lines
5.4 KiB
<?php |
|
/** |
|
* Console Application class file. |
|
* |
|
* @author Qiang Xue <qiang.xue@gmail.com> |
|
* @link http://www.yiiframework.com/ |
|
* @copyright Copyright © 2008-2012 Yii Software LLC |
|
* @license http://www.yiiframework.com/license/ |
|
*/ |
|
|
|
namespace yii\console; |
|
|
|
/** |
|
* \yii\console\Application represents a console application. |
|
* |
|
* \yii\console\Application extends {@link \yii\base\Application} by providing functionalities |
|
* specific to console requests. In particular, it deals with console requests |
|
* through a command-based approach: |
|
* <ul> |
|
* <li>A console application consists of one or several possible user commands;</li> |
|
* <li>Each user command is implemented as a class extending {@link \yii\console\Command};</li> |
|
* <li>User specifies which command to run on the command line;</li> |
|
* <li>The command processes the user request with the specified parameters.</li> |
|
* </ul> |
|
* |
|
* The command classes reside in the directory {@link getCommandPath commandPath}. |
|
* The name of the class follows the pattern: <command-name>Command, and its |
|
* file name is the same the class name. For example, the 'ShellCommand' class defines |
|
* a 'shell' command and the class file name is 'ShellCommand.php'. |
|
* |
|
* To run the console application, enter the following on the command line: |
|
* <pre> |
|
* php path/to/entry_script.php <command name> [param 1] [param 2] ... |
|
* </pre> |
|
* |
|
* You may use the following to see help instructions about a command: |
|
* <pre> |
|
* php path/to/entry_script.php help <command name> |
|
* </pre> |
|
* |
|
* @property string $commandPath The directory that contains the command classes. Defaults to 'protected/commands'. |
|
* @property CommandRunner $commandRunner The command runner. |
|
* |
|
* @author Qiang Xue <qiang.xue@gmail.com> |
|
* @since 2.0 |
|
*/ |
|
class Application extends \yii\base\Application |
|
{ |
|
/** |
|
* @var array mapping from command name to command configurations. |
|
* Each command configuration can be either a string or an array. |
|
* If the former, the string should be the file path of the command class. |
|
* If the latter, the array must contain a 'class' element which specifies |
|
* the command's class name or {@link \YiiBase::getPathOfAlias class path alias}. |
|
* The rest name-value pairs in the array are used to initialize |
|
* the corresponding command properties. For example, |
|
* <pre> |
|
* array( |
|
* 'email'=>array( |
|
* 'class'=>'path.to.Mailer', |
|
* 'interval'=>3600, |
|
* ), |
|
* 'log'=>'path/to/LoggerCommand.php', |
|
* ) |
|
* </pre> |
|
*/ |
|
public $commandMap=array(); |
|
|
|
private $_commandPath; |
|
|
|
/** |
|
* @var \yii\console\CommandRunner |
|
*/ |
|
private $_runner; |
|
|
|
/** |
|
* Initializes the application by creating the command runner. |
|
*/ |
|
public function init() |
|
{ |
|
if(!isset($_SERVER['argv'])) |
|
{ |
|
die('This script must be run from the command line.'); |
|
} |
|
$this->_runner=$this->createCommandRunner(); |
|
$this->_runner->commands=$this->commandMap; |
|
$this->_runner->addCommands($this->getCommandPath()); |
|
} |
|
|
|
/** |
|
* Processes the user request. |
|
* This method creates a console command runner to handle the particular user command. |
|
*/ |
|
public function processRequest() |
|
{ |
|
$this->_runner->run($_SERVER['argv']); |
|
} |
|
|
|
/** |
|
* Creates the command runner instance. |
|
* @return CommandRunner the command runner |
|
*/ |
|
protected function createCommandRunner() |
|
{ |
|
return new CommandRunner(); |
|
} |
|
|
|
/** |
|
* Displays the captured PHP error. |
|
* This method displays the error in console mode when there is |
|
* no active error handler. |
|
* @param integer $code error code |
|
* @param string $message error message |
|
* @param string $file error file |
|
* @param string $line error line |
|
*/ |
|
public function displayError($code,$message,$file,$line) |
|
{ |
|
echo "PHP Error[$code]: $message\n"; |
|
echo " in file $file at line $line\n"; |
|
$trace=debug_backtrace(); |
|
// skip the first 4 stacks as they do not tell the error position |
|
if(count($trace)>4) |
|
$trace=array_slice($trace,4); |
|
foreach($trace as $i=>$t) |
|
{ |
|
if(!isset($t['file'])) |
|
$t['file']='unknown'; |
|
if(!isset($t['line'])) |
|
$t['line']=0; |
|
if(!isset($t['function'])) |
|
$t['function']='unknown'; |
|
echo "#$i {$t['file']}({$t['line']}): "; |
|
if(isset($t['object']) && is_object($t['object'])) |
|
echo get_class($t['object']).'->'; |
|
echo "{$t['function']}()\n"; |
|
} |
|
} |
|
|
|
/** |
|
* Displays the uncaught PHP exception. |
|
* This method displays the exception in console mode when there is |
|
* no active error handler. |
|
* @param Exception $exception the uncaught exception |
|
*/ |
|
public function displayException($exception) |
|
{ |
|
echo $exception; |
|
} |
|
|
|
/** |
|
* @return string the directory that contains the command classes. Defaults to 'protected/commands'. |
|
*/ |
|
public function getCommandPath() |
|
{ |
|
$applicationCommandPath = $this->getBasePath().DIRECTORY_SEPARATOR.'commands'; |
|
if($this->_commandPath===null && file_exists($applicationCommandPath)) |
|
$this->setCommandPath($applicationCommandPath); |
|
return $this->_commandPath; |
|
} |
|
|
|
/** |
|
* @param string $value the directory that contains the command classes. |
|
* @throws CException if the directory is invalid |
|
*/ |
|
public function setCommandPath($value) |
|
{ |
|
if(($this->_commandPath=realpath($value))===false || !is_dir($this->_commandPath)) |
|
throw new \yii\base\Exception(Yii::t('yii','The command path "{path}" is not a valid directory.', |
|
array('{path}'=>$value))); |
|
} |
|
|
|
/** |
|
* Returns the command runner. |
|
* @return CConsoleCommandRunner the command runner. |
|
*/ |
|
public function getCommandRunner() |
|
{ |
|
return $this->_runner; |
|
} |
|
}
|
|
|