123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180 |
- <?php
- /**
- * CConsoleCommandRunner 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/
- */
- /**
- * CConsoleCommandRunner manages commands and executes the requested command.
- *
- * @property string $scriptName The entry script name.
- * @property CConsoleCommand $command The currently active command.
- *
- * @author Qiang Xue <qiang.xue@gmail.com>
- * @package system.console
- * @since 1.0
- */
- class CConsoleCommandRunner extends CComponent
- {
- /**
- * @var array list of all available commands (command name=>command configuration).
- * Each command configuration can be either a string or an array.
- * If the former, the string should be the class name or
- * {@link YiiBase::getPathOfAlias class path alias} of the command.
- * 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',
- * )
- * </pre>
- */
- public $commands=array();
- private $_scriptName;
- private $_command;
- /**
- * Executes the requested command.
- * @param array $args list of user supplied parameters (including the entry script name and the command name).
- * @return integer|null application exit code returned by the command.
- * if null is returned, application will not exit explicitly. See also {@link CConsoleApplication::processRequest()}.
- * (return value is available since version 1.1.11)
- */
- public function run($args)
- {
- $this->_scriptName=$args[0];
- array_shift($args);
- if(isset($args[0]))
- {
- $name=$args[0];
- array_shift($args);
- }
- else
- $name='help';
- $oldCommand=$this->_command;
- if(($command=$this->createCommand($name))===null)
- $command=$this->createCommand('help');
- $this->_command=$command;
- $command->init();
- $exitCode=$command->run($args);
- $this->_command=$oldCommand;
- return $exitCode;
- }
- /**
- * @return string the entry script name
- */
- public function getScriptName()
- {
- return $this->_scriptName;
- }
- /**
- * Returns the currently running command.
- * @return CConsoleCommand|null the currently active command.
- * @since 1.1.14
- */
- public function getCommand()
- {
- return $this->_command;
- }
- /**
- * @param CConsoleCommand $value the currently active command.
- * @since 1.1.14
- */
- public function setCommand($value)
- {
- $this->_command=$value;
- }
- /**
- * Searches for commands under the specified directory.
- * @param string $path the directory containing the command class files.
- * @return array list of commands (command name=>command class file)
- */
- public function findCommands($path)
- {
- if(($dir=@opendir($path))===false)
- return array();
- $commands=array();
- while(($name=readdir($dir))!==false)
- {
- $file=$path.DIRECTORY_SEPARATOR.$name;
- if(!strcasecmp(substr($name,-11),'Command.php') && is_file($file))
- $commands[strtolower(substr($name,0,-11))]=$file;
- }
- closedir($dir);
- return $commands;
- }
- /**
- * Adds commands from the specified command path.
- * If a command already exists, the new one will be ignored.
- * @param string $path the alias of the directory containing the command class files.
- */
- public function addCommands($path)
- {
- if(($commands=$this->findCommands($path))!==array())
- {
- foreach($commands as $name=>$file)
- {
- if(!isset($this->commands[$name]))
- $this->commands[$name]=$file;
- }
- }
- }
- /**
- * @param string $name command name (case-insensitive)
- * @return CConsoleCommand the command object. Null if the name is invalid.
- */
- public function createCommand($name)
- {
- $name=strtolower($name);
- $command=null;
- if(isset($this->commands[$name]))
- $command=$this->commands[$name];
- else
- {
- $commands=array_change_key_case($this->commands);
- if(isset($commands[$name]))
- $command=$commands[$name];
- }
- if($command!==null)
- {
- if(is_string($command)) // class file path or alias
- {
- if(strpos($command,'/')!==false || strpos($command,'\\')!==false)
- {
- $className=substr(basename($command),0,-4);
- if(!class_exists($className,false))
- require_once($command);
- }
- else // an alias
- $className=Yii::import($command);
- return new $className($name,$this);
- }
- else // an array configuration
- return Yii::createComponent($command,$name,$this);
- }
- elseif($name==='help')
- return new CHelpCommand('help',$this);
- else
- return null;
- }
- }
|