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 @@
-