Laravel 4. Artisan команды. Создание и регистрация

Категория: Laravel

Краткое описание процесса создания artisan команды (command) на примере одной команды генерации PHPDoc документации для обеспечения дополнения кода в собственных фасадах. Я назвал эту команду xdoc, точнее xdoc:generate и дальше я буду использовать это имя при создании и регистрации команды.

Для описания команды xdoc:generate (да, это именно одна команда, а не команда xdoc с параметром generate) нужен отдельный класс. Если, например, понадобится команда xdoc:clear - это будет другой класс. Префикс в командах используется больше для визуальной группировки, нежели для агрегирования реализации команд одной группы. Помним, one command - one class ☺

Генерация

Сгенерировать костяк новой команды:

php artisan command:make XdocGenerate --command=xdoc:generate

С помощью опций  --path=app/path --namespace=Namespace  вы можете задать другой каталог и namespace для вашей команды.  Сразу укажите в классе команды свойства $name (имя команды) и $description (описание доступно в справке).

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

Команду необходимо зарегистрировать в файле app/start/artisan.php:

Artisan::add(new Xdoc);

Если команда находится в IoC контейнере, вы можете зарегистрировать ее так:

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

После этого команда доступна для использования, вы ее увидите в Available commands, при вызове php artisan.

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

Синтаксис нижеизложенной команды:

xdoc [--opt="..."] [--eager-mode] arg [arg2]
use Illuminate\Console\Command;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Input\InputArgument;

class XdocGenerateCommand extends Command
{
  protected $name = 'xdoc:generate';
  protected $description = 'Сгенерировать документацию для фасадов.';

  // Тело команды
  public function fire()
  {
    $this->info('Вывести информационное сообщение'); // info, comment, question, error
    $this->ask('Запросить информацию: ');
    $pass = $this->secret('Введите пароль?');
    $this->confirm('Подтвердить действие? Y/n', 'Y'); // Y по умолчанию

    $arg = $this->argument('arg');
    $arguments = $this->argument();
    $opt = $this->option('opt');

    // Вызов другой команды
    $this->call('command.name', array('arg' => 'foo', '--opt' => 'bar'));
  }

  protected function getOptions()
  {
    return array(
      ['opt',  'shortcut', InputOption::VALUE_REQUIRED, 'Описание --opt.', 'default'],
      ['eager-mode', null, InputOption::VALUE_NONE, 'Метка-опция, не принимает значения.'],
    );
  }

  protected function getArguments()
  {
    return array(
      array('arg1',  InputArgument::REQUIRED, 'Обязательный аргумент', 'default value'),
      array('arg2', InputArgument::OPTIONAL, 'Описание', null),
    );
  }
}

Вызов artisan команд

Есть несколько вариантов вызова artisan команд из PHP кода. Например, можно использовать PHP ф-ции exec()system(),  passthru() или вызвать следующий метод, если доступен класс Artisan:

Artisan::call('db:seed', ['--class' => 'SomeSeeder']);

#laravel, #artisan, #command, #cli

категория: Laravel