Как создать пользовательскую консольную команду (ремесленник) для Laravel 5.3

Laravel имеет интерфейс командной строки с именем Artisan. Этот интерфейс предоставляет разработчику множество полезных команд для ускорения процесса разработки.

Кроме того, вы можете расширить ремесленник своими собственными командами, чтобы создавать и автоматизировать уникальные задачи вашего проекта Laravel. Команды обычно хранятся в app/Console/Commands Однако вы можете выбрать собственное место хранения, если Composer может загружать ваши команды.

В этой статье вы узнаете, как легко создать собственную команду для ремесленника в Laravel 5.3.

Создать и зарегистрировать команду

Laravel поможет вам сделать все проще, он уже интегрировал make:console NewClassName Команда для ускорения процесса разработки. Эта команда ожидает в качестве первого аргумента имя класса и, необязательно, параметр команды, чтобы указать непосредственно имя команды без изменения класса.

Чтобы создать новую консольную команду с именем quiz:start с именем класса QuizStart выполните в консоли следующую команду:

php artisan make:command QuizStart --command=quiz:start

Замечания: если вы не хотите использовать консоль, скопируйте пример класса в «Структуру команды» и измените имя файла и класса по своему усмотрению. Помните также, что в предыдущих версиях Laravel < 5.2, instead of , вам нужно будет использовать make:console,

Это должно создать класс QuizStart в /app/console/commands каталог с App\Console\Commands Пространство имен.

Наконец, наша команда не зарегистрирована, поэтому нам нужно добавить ее в нашу /app/console/Kernel.php файл в $commands массив (укажите путь к классу и имя):

protected $commands = [
// Commands\Inspire::class,
'App\Console\Commands\QuizStart'
];

использование php artisan cache:clear очистить кеш и попытаться выполнить команду с предыдущим именем:

php artisan quiz:start

Как и ожидалось, эта команда ничего не должна делать, теперь вам нужно только научиться работать с ней.

Структура команды

Чтобы настроить имя вашей команды и описание, измените имя непосредственно в классе, и вся логика команды будет сохранена в функции handle.

Распечатать текст

Чтобы отправить вывод на консоль, вы можете выбрать один из следующих методов: строка, информация, комментарий, вопрос и методы ошибки. Каждый из этих методов будет использовать соответствующие цвета ANSI для своих целей.

/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
$this->line("Some text");
$this->info("Hey, watch this !");
$this->comment("Just a comment passing by");
$this->question("Why did you do that?");
$this->error("Ops, that should not happen.");
}

Ввод команды: аргументы и опции

Ожидайте аргументы и параметры в команде

Если вы не установите, какие параметры или опции ожидают вашу функцию, ваша команда не сможет работать, даже если вы выполните ее с параметрами.

В Laravel в свойстве signature (имя команды) мы определяем наши аргументы и параметры прямо в строке (в отличие от более старых версий Laravel):

/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'quiz:start {user} {age} {--difficulty=} {--istest=}';

Аргументы регистрируются в нашем комманде с простым синтаксисом {argumentName} и варианты как {--optionName=}, так что теперь нам не нужно создавать опции get и методы arguments в нашем классе.

Его синтаксис очень прост для понимания, в основном это все способы использования аргументов и опций в нашей команде (если вы хотите больше подробностей, пожалуйста, прочитайте документы):

  • аргументация: quiz:start {argument},
  • Необязательный аргумент (обратите внимание на знак вопроса рядом с именем аргумента): quiz:start {argument?},
  • Аргумент со значением по умолчанию: quiz:start {argument=defaultValue},
  • Булева опция: quiz:start --myOption,
  • Вариант со значением: quiz:start --myOption=,
  • Вариант со значением и значением по умолчанию: quiz:start --myOption=12,

Получить значения аргументов и опций

Если вашей команде нужны некоторые значения для работы (параметры), вам нужно получить доступ к этим значениям, чтобы использовать их в вашей команде. Для решения этой задачи вы можете использовать методы аргумента и опции:

/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
// Get single Parameters
$username = $this->argument('user');
$difficulty = $this->option('difficulty');
// Get all
$arguments = $this->arguments();
$options = $this->options();
// Stop execution and ask a question
$answer = $this->ask('What is your name?');
// Ask for sensitive information
$password = $this->secret('What is the password?');
// Choices
$name = $this->choice('What is your name?', ['Taylor', 'Dayle'], $default);
// Confirmation
if ($this->confirm('Is '.$name.' correct, do you wish to continue? [y|N]')) {
//
}
}

пример

Следующая функция создаст в консоли интерактивный тест, и вам нужно ответить на все из них. После того, как тест будет заполнен, он покажет ответы, которые вы набрали.

/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
$difficulty =  $this->option('difficulty');
if(!$difficulty){
$difficulty = 'easy';
}
$this->line('Welcome '.$this->argument('user').", starting test in difficulty : ". $difficulty);
$questions = [
'easy' => [
'How old are you ?', "What is the name of your mother?",
'Do you have 3 parents ?','Do you like Javascript?',
'Do you know what is a JS promise?'
],
'hard' => [
'Why the sky is blue?', "Can a kangaroo jump higher than a house?",
'Do you think i am a bad father?','why the dinosaurs disappeared?',
"why don't whales have gills?"
]
];
$questionsToAsk = $questions[$difficulty];
$answers = [];
foreach($questionsToAsk as $question){
$answer = $this->ask($question);
array_push($answers,$answer);
}
$this->info("Thanks for do the quiz in the console, your answers : ");
for($i = 0;$i line(($i + 1).') '. $answers[$i]);
}
}

Laravel ремесленник викторина

Выполнение команды от контроллера или маршрута

Очевидно, как мы использовали просить метод, он не должен работать, однако для других методов вы сможете выполнить команду, используя:

$exitCode = Artisan::call('quiz:start', [
'user' => 'Carlos', '--difficulty' => 'hard'
]);

Если вам нужна дополнительная информация о ремесленнике, вы можете прочитать документацию здесь. Повеселись !

Ссылка на основную публикацию
Adblock
detector