Как зарегистрировать консольную команду из пакета в Laravel 5?

Начиная с 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?

7

Решение

Не требуется использовать сервисный контейнер и синглтон. Вы можете просто поместить свой командный класс в $this->commands([]); массив в register() раздел вашего поставщика услуг.

Как это :

$this->commands([
Acme\MyCommand::class
]);
22

Другие решения

Я нашел решение, оно было простым:

в registerInstallCommand()
добавлять

$this->commands('command.eternaltree.install');
3

Ларавел 5.6 документы сказать:

/**
* Bootstrap the application services.
*
* @return void
*/
public function boot()
{
if ($this->app->runningInConsole()) {
$this->commands([
FooCommand::class,
BarCommand::class,
]);
}
}

Добавить похожий If заявление в ваш класс поставщика услуг.

3

Лучше поздно, чем никогда.

Вы пытались позвонить eternaltree:install но вы зарегистрировали команду как install:eternaltree,

Ваш ответ правильный … но не было необходимости registerCommands() а также registerInstallCommands() методы. Сохраняйте ваш код простым, просто вызывая commands() метод изнутри register() метод.

-1
По вопросам рекламы [email protected]