Начиная с Laravel 5, мне интересно — как зарегистрироваться и использовать консольную команду из пакета в Laravel 5.
Как в laracast обсудить https://laracasts.com/discuss/channels/tips/developing-your-packages-in-laravel-5, я создаю структуру каталогов, добавляю пакет в автозагрузку и создаю поставщика услуг
<?php namespace Goodvin\EternalTree;
use Console\InstallCommand;
use Illuminate\Support\ServiceProvider;
class EternalTreeServiceProvider extends ServiceProvider
{
public function boot()
{
}
public function register()
{
$this->registerCommands();
}
protected function registerCommands()
{
$this->registerInstallCommand();
}
protected function registerInstallCommand()
{
$this->app->singleton('command.eternaltree.install', function($app) {
return new InstallCommand();
});
}
public function provides()
{
return [
'command.eternaltree.install'
];
}
}
Мой скрипт InstallCommand.php хранится в / src / Console
<?php namespace Goodvin\EternalTree\Console;
use Illuminate\Console\Command;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Input\InputArgument;
class InstallCommand extends Command {
protected $name = 'install:eternaltree';
protected $description = 'Command for EternalTree migration & model install.';
public function __construct()
{
parent::__construct();
}
public function fire()
{
$this->info('Command eternaltree:install fire');
}
}
Я регистрирую поставщика услуг в app.php & выполнить дамп-автозагрузку. Но когда я пытаюсь выполнить
php artisan eternaltree:install
это покажет мне
[InvalidArgumentException] There are no commands defined in the "eternaltree" namespace.
Я думаю, что моя команда не зарегистрирована поставщиком услуг, потому что в списке php artisan моя команда не отображается. Может кто-нибудь объяснить мне, как правильно регистрировать команды в собственном пакете в Laravel 5?
Не требуется использовать сервисный контейнер и синглтон. Вы можете просто поместить свой командный класс в $this->commands([]);
массив в register()
раздел вашего поставщика услуг.
Как это :
$this->commands([
Acme\MyCommand::class
]);
Я нашел решение, оно было простым:
в registerInstallCommand()
добавлять
$this->commands('command.eternaltree.install');
/**
* Bootstrap the application services.
*
* @return void
*/
public function boot()
{
if ($this->app->runningInConsole()) {
$this->commands([
FooCommand::class,
BarCommand::class,
]);
}
}
Добавить похожий If
заявление в ваш класс поставщика услуг.
Лучше поздно, чем никогда.
Вы пытались позвонить eternaltree:install
но вы зарегистрировали команду как install:eternaltree
,
Ваш ответ правильный … но не было необходимости registerCommands()
а также registerInstallCommands()
методы. Сохраняйте ваш код простым, просто вызывая commands()
метод изнутри register()
метод.