. */ namespace Doctrine\Common\Cli; /** * CLI Namespace class * * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * @link www.doctrine-project.org * @since 2.0 * @version $Revision$ * @author Benjamin Eberlei * @author Guilherme Blanco * @author Jonathan Wage * @author Roman Borschel */ class TaskNamespace extends AbstractNamespace { /** * @var boolean CLI Tasks flag to check if they are already initialized */ private $_initialized = false; /** * @var string CLI Namespace full name */ private $_fullName = null; /** * @var string CLI Namespace name */ private $_name = null; /** * @var array Available tasks */ private $_tasks = array(); /** * The CLI namespace * * @param string $name CLI Namespace name */ public function __construct($name) { $this->_name = self::formatName($name); } /** * Retrieve an instantiated CLI Task by given its name. * * @param string $name CLI Task name * * @return AbstractTask */ public function getTask($name) { // Check if task exists in namespace if ($this->hasTask($name)) { $taskClass = $this->_tasks[self::formatName($name)]; return new $taskClass($this); } throw CliException::taskDoesNotExist($name, $this->getFullName()); } /** * Retrieve all CLI Task in this Namespace. * * @return array */ public function getTasks() { return $this->_tasks; } /** * Retrieve all defined CLI Tasks * * @return array */ public function getAvailableTasks() { $tasks = parent::getAvailableTasks(); foreach ($this->_tasks as $taskName => $taskClass) { $fullName = $this->getFullName() . ':' . $taskName; $tasks[$fullName] = $taskClass; } return $tasks; } /** * Add a single task to CLI Namespace. * Example of inclusion support to a single task: * * [php] * $cliOrmNamespace->addTask('my-custom-task', 'MyProject\Cli\Tasks\MyCustomTask'); * * @param string $name CLI Task name * @param string $class CLI Task class (FQCN - Fully Qualified Class Name) * * @return TaskNamespace This object instance */ public function addTask($name, $class) { $name = self::formatName($name); if ($this->hasTask($name)) { throw CliException::cannotOverrideTask($name); } return $this->overrideTask($name, $class); } /** * Overrides task on CLI Namespace. * Example of inclusion support to a single task: * * [php] * $cliOrmNamespace->overrideTask('schema-tool', 'MyProject\Cli\Tasks\MyCustomTask'); * * @param string $name CLI Task name * @param string $class CLI Task class (FQCN - Fully Qualified Class Name) * * @return TaskNamespace This object instance */ public function overrideTask($name, $class) { $name = self::formatName($name); $this->_tasks[$name] = $class; return $this; } /** * Check existance of a CLI Task * * @param string CLI Task name * * @return boolean TRUE if CLI Task if defined, false otherwise */ public function hasTask($name) { $name = self::formatName($name); return isset($this->_tasks[$name]); } /** * Retrieves the CLI Namespace name * * @return string CLI Namespace name */ public function getName() { return $this->_name; } /** * Retrieves the full CLI Namespace name * * @return string CLI Namespace full name */ public function getFullName() { if ($this->_fullName === null) { $str = $this->_name; while ( ($parentNamespace = $this->getParentNamespace()) !== null && ! ($parentNamespace instanceof CliController) ) { $str = $parentNamespace->getFullName() . ':' . $str; } $this->_fullName = $str; } return $this->_fullName; } /** * Effectively instantiate and execute a given CLI Task * * @param string $name CLI Task name * @param array $arguments CLI Task arguments */ public function runTask($name, $arguments = array()) { try { $task = $this->getTask($name); // Merge global configuration if it exists if (($globalArgs = $this->getConfiguration()->getAttribute('globalArguments')) !== null) { $arguments = array_merge($globalArgs, $arguments); } $task->setArguments($arguments); if ((isset($arguments['help']) && $arguments['help']) || (isset($arguments['h']) && $arguments['h'])) { $task->extendedHelp(); // User explicitly asked for help option } else if (isset($arguments['basic-help']) && $arguments['basic-help']) { $task->basicHelp(); // User explicitly asked for basic help option } else if ($task->validate()) { $task->run(); } } catch (CliException $e) { $message = $this->getFullName() . ':' . $name . ' => ' . $e->getMessage(); $printer = $this->getPrinter(); // If we want the trace of calls, append to error message if (isset($arguments['trace']) && $arguments['trace']) { $message .= PHP_EOL . PHP_EOL . $e->getTraceAsString(); } $printer->writeln($message, 'ERROR'); // Unable instantiate task or task is not valid if ($task !== null) { $printer->write(PHP_EOL); $task->basicHelp(); // Fallback of not-valid task arguments } $printer->write(PHP_EOL); } } }