Laravel 4. Artisan команды. Создание и регистрация
Краткое описание процесса создания 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