From fc927aa63a321a1cb9a66bc8fa485abb2f73e7ea Mon Sep 17 00:00:00 2001 From: Taylor Otwell Date: Mon, 6 Feb 2012 20:08:25 -0600 Subject: [PATCH] cleaning up artisan. --- laravel/cli/artisan.php | 2 +- laravel/cli/command.php | 101 +++++++++++++++++++++++++++++++++++----- laravel/cli/console.php | 53 --------------------- 3 files changed, 90 insertions(+), 66 deletions(-) delete mode 100644 laravel/cli/console.php diff --git a/laravel/cli/artisan.php b/laravel/cli/artisan.php index 8d4672dc..ea6d8dd5 100644 --- a/laravel/cli/artisan.php +++ b/laravel/cli/artisan.php @@ -15,7 +15,7 @@ * retrieve them from the various parts of the CLI code. We can use * the Request class to access them conveniently. */ -list($arguments, $_SERVER['CLI']) = Console::options($_SERVER['argv']); +list($arguments, $_SERVER['CLI']) = Command::options($_SERVER['argv']); $_SERVER['CLI'] = array_change_key_case($_SERVER['CLI'], CASE_UPPER); diff --git a/laravel/cli/command.php b/laravel/cli/command.php index 55b0a816..147a8bad 100644 --- a/laravel/cli/command.php +++ b/laravel/cli/command.php @@ -9,28 +9,35 @@ class Command { /** * Run a CLI task with the given arguments. * + * + * // Call the migrate artisan task + * Command::run(array('migrate')); + * + * // Call the migrate task with some arguments + * Command::run(array('migrate:rollback', 'bundle-name')) + * + * * @param array $arguments * @return void */ public static function run($arguments = array()) { - if ( ! isset($arguments[0])) - { - throw new \Exception("Whoops! You forgot to provide the task name."); - } + static::validate($arguments); list($bundle, $task, $method) = static::parse($arguments[0]); - // If the task exists within a bundle, we will start the bundle so that - // any dependencies can be registered in the application IoC container. - // If the task is registered in the container, it will be resolved - // via the container instead of by this class. + // If the task exists within a bundle, we will start the bundle so that any + // dependencies can be registered in the application IoC container. If the + // task is registered in the container, it will be resolved via the + // container instead of by this class. if (Bundle::exists($bundle)) Bundle::start($bundle); - // Once the bundle has been started, we will attempt to resolve the - // task instance. Tasks may be resolved through the file system or - // through the application IoC container. - if (is_null($task = static::resolve($bundle, $task))) + // Once the bundle has been started, we will attempt to resolve the task + // instance. Tasks may be resolved through the file system or through + // the application IoC container. + $task = static::resolve($bundle, $task); + + if (is_null($task)) { throw new \Exception("Sorry, I can't find that task."); } @@ -38,6 +45,20 @@ public static function run($arguments = array()) $task->$method(array_slice($arguments, 1)); } + /** + * Determine if the given command arguments are valid. + * + * @param array $arguments + * @return void + */ + protected static function validate($arguments) + { + if ( ! isset($arguments[0])) + { + throw new \Exception("You forgot to provide the task name."); + } + } + /** * Parse the task name to extract the bundle, task, and method. * @@ -66,6 +87,14 @@ protected static function parse($task) /** * Resolve an instance of the given task name. * + * + * // Resolve an instance of a task + * $task = Command::resolve('application', 'migrate'); + * + * // Resolve an instance of a task wtihin a bundle + * $task = Command::resolve('bundle', 'foo'); + * + * * @param string $bundle * @param string $task * @return object @@ -95,6 +124,54 @@ public static function resolve($bundle, $task) } } + /** + * Parse the command line arguments and return the results. + * + * @param array $argv + * @return array + */ + public static function options($argv) + { + $options = array(); + + $arguments = array(); + + for ($i = 0, $count = count($argv); $i < $count; $i++) + { + $argument = $argv[$i]; + + // If the CLI argument starts with a double hyphen, it is an option, + // so we will extract the value and add it to the array of options + // to be returned by the method. + if (starts_with($argument, '--')) + { + // By default, we will assume the value of the options is true, + // but if the option contains an equals sign, we will take the + // value to the right of the equals sign as the value and + // remove the value from the option key. + list($key, $value) = array(substr($argument, 2), true); + + if (($equals = strpos($argument, '=')) !== false) + { + $key = substr($argument, 2, $equals - 2); + + $value = substr($argument, $equals + 1); + } + + $options[$key] = $value; + } + // If the CLI argument does not start with a double hyphen it's + // simply an argument to be passed to the console task so we'll + // add it to the array of "regular" arguments. + else + { + $arguments[] = $argument; + } + } + + return array($arguments, $options); + } + /** * Format a bundle and task into a task class name. * diff --git a/laravel/cli/console.php b/laravel/cli/console.php deleted file mode 100644 index 0591f938..00000000 --- a/laravel/cli/console.php +++ /dev/null @@ -1,53 +0,0 @@ -