Retrieving Input
While your command is executing, you will obviously need to access the values for the arguments and options accepted by your command. To do so, you may use the argument
and option
methods:
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
$userId = $this->argument('user');
//
}
If you need to retrieve all of the arguments as an array
, call the arguments
method:
$arguments = $this->arguments();
Options may be retrieved just as easily as arguments using the option
method. To retrieve all of the options as an array, call the options
method:
// Retrieve a specific option...
$queueName = $this->option('queue');
// Retrieve all options...
$options = $this->options();
If the argument or option does not exist, null
will be returned.
Prompting For Input
In addition to displaying output, you may also ask the user to provide input during the execution of your command. The ask
method will prompt the user with the given question, accept their input, and then return the user's input back to your command:
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
$name = $this->ask('What is your name?');
}
The secret
method is similar to ask
, but the user's input will not be visible to them as they type in the console. This method is useful when asking for sensitive information such as a password:
$password = $this->secret('What is the password?');
Asking For Confirmation
If you need to ask the user for a simple confirmation, you may use the confirm
method. By default, this method will return false
. However, if the user enters y
or yes
in response to the prompt, the method will return true
.
if ($this->confirm('Do you wish to continue?')) {
//
}
Auto-Completion
The anticipate
method can be used to provide auto-completion for possible choices. The user can still choose any answer, regardless of the auto-completion hints:
$name = $this->anticipate('What is your name?', ['Taylor', 'Dayle']);
Alternatively, you may pass a Closure as the second argument to the anticipate
method. The Closure will be called each time the user types an input character. The Closure should accept a string parameter containing the user's input so far, and return an array of options for auto-completion:
$name = $this->anticipate('What is your name?', function ($input) {
// Return auto-completion options...
});
Multiple Choice Questions
If you need to give the user a predefined set of choices, you may use the choice
method. You may set the array index of the default value to be returned if no option is chosen:
$name = $this->choice('What is your name?', ['Taylor', 'Dayle'], $defaultIndex);
In addition, the choice
method accepts optional fourth and fifth arguments for determining the maximum number of attempts to select a valid response and whether multiple selections are permitted:
$name = $this->choice(
'What is your name?',
['Taylor', 'Dayle'],
$defaultIndex,
$maxAttempts = null,
$allowMultipleSelections = false
);
Writing Output
To send output to the console, use the line
, info
, comment
, question
and error
methods. Each of these methods will use appropriate ANSI colors for their purpose. For example, let's display some general information to the user. Typically, the info
method will display in the console as green text:
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
$this->info('Display this on the screen');
}
To display an error message, use the error
method. Error message text is typically displayed in red:
$this->error('Something went wrong!');
If you would like to display plain, uncolored console output, use the line
method:
$this->line('Display this on the screen');
Table Layouts
The table
method makes it easy to correctly format multiple rows / columns of data. Just pass in the headers and rows to the method. The width and height will be dynamically calculated based on the given data:
$headers = ['Name', 'Email'];
$users = App\User::all(['name', 'email'])->toArray();
$this->table($headers, $users);
Progress Bars
For long running tasks, it could be helpful to show a progress indicator. Using the output object, we can start, advance and stop the Progress Bar. First, define the total number of steps the process will iterate through. Then, advance the Progress Bar after processing each item:
$users = App\User::all();
$bar = $this->output->createProgressBar(count($users));
$bar->start();
foreach ($users as $user) {
$this->performTask($user);
$bar->advance();
}
$bar->finish();