Метод choice
Метод choice используется в консольных командах Laravel для создания интерактивного меню выбора. Он предлагает пользователю выбрать один вариант из списка и возвращает выбранное значение. Первым параметром передаётся вопрос, вторым - массив вариантов, третьим - индекс выбранного по умолчанию, четвёртым - количество попыток ввода. Метод блокирует выполнение команды до получения ответа от пользователя.
Синтаксис
<?php
$this->choice($question, $choices, $default, $maxAttempts);
?>
Пример
Давайте создадим команду, которая спрашивает у пользователя его любимый язык программирования:
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
class AskLanguageCommand extends Command
{
protected $signature = 'ask:language';
protected $description = 'Ask user about favorite programming language';
public function handle()
{
$languages = ['PHP', 'JavaScript', 'Python', 'Ruby', 'Go'];
$choice = $this->choice(
'What is your favorite programming language?',
$languages,
0,
3
);
$this->info("You selected: {$choice}");
}
}
?>
Результат выполнения команды в терминале:
What is your favorite programming language?
[0] PHP
[1] JavaScript
[2] Python
[3] Ruby
[4] Go
> 0
You selected: PHP
Пример
Рассмотрим пример с выбором действия в консольной команде:
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use App\Models\User;
class UserActionCommand extends Command
{
protected $signature = 'user:action';
protected $description = 'Perform action on user';
public function handle()
{
$actions = ['view', 'delete', 'block', 'unblock'];
$action = $this->choice(
'Select action for user:',
$actions,
0
);
$user = User::first();
if ($action === 'view') {
$this->info("User: {$user->name}");
} elseif ($action === 'delete') {
$user->delete();
$this->warn('User deleted successfully');
} else {
$this->info("Action '{$action}' performed on user");
}
}
}
?>
Результат выполнения команды с выбором действия:
Select action for user:
[0] view
[1] delete
[2] block
[3] unblock
> 0
User: John Doe
Пример
Использование ассоциативного массива для более осмысленных подписей:
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
class SetupCommand extends Command
{
protected $signature = 'app:setup';
protected $description = 'Configure application settings';
public function handle()
{
$options = [
'production' => 'Production environment',
'staging' => 'Staging environment',
'development' => 'Development environment'
];
$choice = $this->choice(
'Select environment for setup:',
$options,
2
);
$key = array_search($choice, $options);
$this->info("Setting up {$choice} environment");
if ($key === 'production') {
$this->call('config:cache');
$this->call('route:cache');
}
}
}
?>
Результат выполнения команды:
Select environment for setup:
[0] Production environment
[1] Staging environment
[2] Development environment
> 2
Setting up Development environment