Разработка команды для консоли

Введение

В дополнение к предоставленным консольным командам, вы можете создавать свои собственные, которые должны находится в папке с плагином в подпапке console. Используйте инструмент командной строки - scaffolding для генерации файла.

Создание команды

Если Вы хотите создать консольную команду acme:mycommand, Вы должны создать файл plugins/acme/blog/console/MyCommand.php со следующим кодом:

<?php namespace Acme\Blog\Console;

use Illuminate\Console\Command;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Input\InputArgument;

class MyCommand extends Command
{
    /**
     * @var string The console command name.
     */
    protected $name = 'acme:mycommand';

    /**
     * @var string The console command description.
     */
    protected $description = 'Does something cool.';

    /**
     * Execute the console command.
     * @return void
     */
    public function fire()
    {
        $this->output->writeln('Hello world!');
    }

    /**
     * Get the console command arguments.
     * @return array
     */
    protected function getArguments()
    {
        return [];
    }

    /**
     * Get the console command options.
     * @return array
     */
    protected function getOptions()
    {
        return [];
    }

}

После того, как ваш класс будет создан, Вы должны указать свойства name и description.

Метод fire() вызывается в момент выполнения вашей команды.

Определение аргументов

В методе getArguments() Вы можете указать любые аргументы, которые необходимы для работы вашей команды. Например:

    /**
     * Get the console command arguments.
     * @return array
     */
    protected function getArguments()
    {
        return [
            // array($name, $mode, $description, $defaultValue)
            ['example', InputArgument::REQUIRED, 'An example argument.', 'defaultValue'],
        ];
    }

Переменная $mode может принимать только следующие значения: InputArgument::REQUIRED или InputArgument::OPTIONAL.

Определение параметров

Параметры определяются в методе getOptions(). Например:

    /**
     * Get the console command options.
     * @return array
     */
    protected function getOptions()
    {
        return [
            // array($name, $shortcut, $mode, $description, $defaultValue)
            ['example', null, InputOption::VALUE_OPTIONAL, 'An example option.', null],
        ];
    }

Переменная $mode может принимать только следующие значения: InputOption::VALUE_REQUIRED, InputOption::VALUE_OPTIONAL, InputOption::VALUE_IS_ARRAY, InputOption::VALUE_NONE.

Значение VALUE_IS_ARRAY означает, что параметр может быть использован несколько раз:

php artisan foo --option=bar --option=baz

Значение VALUE_NONE означает, что параметр используется просто как "ключ":

php artisan foo --option

Получение входных данных

Во время выполнения вашей команды, Вы можете получить доступ к значениям аргументов и параметров при помощи методов $this->argument() и $this->option():

Получить значение аргумента

$value = $this->argument('name');

Получить значения всех аргументов

$arguments = $this->argument();

Получить значение параметра

$value = $this->option('name');

Получить значения всех параметров

$options = $this->option();

Вывод текста в консоль

Вы можете использовать методы: info, comment, question и error, для вывода текста в консоль.

Простое сообщение

$this->info('Display this on the screen');

Сообщение об ошибке

$this->error('Something went wrong!');

Задать вопрос

$name = $this->ask('What is your name?');

$password = $this->secret('What is the password?');

if ($this->confirm('Do you wish to continue? [yes|no]'))
{
    //
}

$this->confirm($question, true); // Указываем значение по умолчанию `true` или `false`

Регистрация команд

Регистрация консольной команды

После того, как Вы закончили с классом команды, не забудьте зарегистрировать его в файле Plugin.php, используя метод registerConsoleCommand():

class Blog extends PluginBase
{
    public function pluginDetails()
    {
        [...]
    }

    public function register()
    {
        $this->registerConsoleCommand('acme.mycommand', 'Acme\Blog\Console\MyConsoleCommand');
    }
}

Вы также можете создать файл init.php в папке с плагином и зарегистрировать команду в нем, используя метод Artisan::add:

Artisan::add(new Acme\Blog\Console\MyCommand);

Регистрация команды в контейнере приложения

Если ваша команда зарегистрирована в контейнере приложения, Вы можете использовать метод Artisan::resolve, чтобы сделать его доступным для Artisan:

Artisan::resolve('binding.name');

Регистрация команды в методе boot()

public function boot()
{
    $this->app->singleton('acme.mycommand', function() {
        return new \Acme\Blog\Console\MyConsoleCommand;
    });

    $this->commands('acme.mycommand');
}

Вызов других команд

Вы можете использовать метод call для вызова других команд:

$this->call('october:up');

Используйте массив для передачи параметров и аргументов:

$this->call('october:update', ['--force' => true]);

$this->call('plugin:refresh', ['name' => 'October.Demo']);