summaryrefslogtreecommitdiff
path: root/framework/console/CConsoleCommandRunner.php
diff options
context:
space:
mode:
Diffstat (limited to 'framework/console/CConsoleCommandRunner.php')
-rw-r--r--framework/console/CConsoleCommandRunner.php142
1 files changed, 142 insertions, 0 deletions
diff --git a/framework/console/CConsoleCommandRunner.php b/framework/console/CConsoleCommandRunner.php
new file mode 100644
index 0000000..b3d3fdf
--- /dev/null
+++ b/framework/console/CConsoleCommandRunner.php
@@ -0,0 +1,142 @@
+<?php
+/**
+ * CConsoleCommandRunner 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/
+ */
+
+/**
+ * CConsoleCommandRunner manages commands and executes the requested command.
+ *
+ * @property string $scriptName The entry script name.
+ *
+ * @author Qiang Xue <qiang.xue@gmail.com>
+ * @version $Id: CConsoleCommandRunner.php 3426 2011-10-25 00:01:09Z alexander.makarow $
+ * @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;
+
+ /**
+ * Executes the requested command.
+ * @param array $args list of user supplied parameters (including the entry script name and the command name).
+ */
+ public function run($args)
+ {
+ $this->_scriptName=$args[0];
+ array_shift($args);
+ if(isset($args[0]))
+ {
+ $name=$args[0];
+ array_shift($args);
+ }
+ else
+ $name='help';
+
+ if(($command=$this->createCommand($name))===null)
+ $command=$this->createCommand('help');
+ $command->init();
+ $command->run($args);
+ }
+
+ /**
+ * @return string the entry script name
+ */
+ public function getScriptName()
+ {
+ return $this->_scriptName;
+ }
+
+ /**
+ * 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);
+ if(isset($this->commands[$name]))
+ {
+ if(is_string($this->commands[$name])) // class file path or alias
+ {
+ if(strpos($this->commands[$name],'/')!==false || strpos($this->commands[$name],'\\')!==false)
+ {
+ $className=substr(basename($this->commands[$name]),0,-4);
+ if(!class_exists($className,false))
+ require_once($this->commands[$name]);
+ }
+ else // an alias
+ $className=Yii::import($this->commands[$name]);
+ return new $className($name,$this);
+ }
+ else // an array configuration
+ return Yii::createComponent($this->commands[$name],$name,$this);
+ }
+ else if($name==='help')
+ return new CHelpCommand('help',$this);
+ else
+ return null;
+ }
+} \ No newline at end of file