Php 如何从Laravel 5中的包注册控制台命令?

Php 如何从Laravel 5中的包注册控制台命令?,php,packages,laravel-5,Php,Packages,Laravel 5,自从Laravel5以来,我很感兴趣——如何从Laravel5的包中注册和使用console命令 正如在laracast中所讨论的,我创建了一个目录结构,将我的包添加到autoload并创建了一个服务提供者 <?php namespace Goodvin\EternalTree; use Console\InstallCommand; use Illuminate\Support\ServiceProvider; class EternalTreeServiceProvider ext

自从Laravel5以来,我很感兴趣——如何从Laravel5的包中注册和使用console命令

正如在laracast中所讨论的,我创建了一个目录结构,将我的包添加到autoload并创建了一个服务提供者

<?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'
        ];
    }
}
它告诉我

[InvalidArgumentException] There are no commands defined in the "eternaltree" namespace.

我认为我的命令没有被服务提供者注册,因为php artisan列表没有显示我的命令。有人能告诉我在Laravel 5的软件包中注册命令的正确方法是什么吗?

我发现一个决定,很简单:

registerInstallCommand()中
加


不需要使用服务容器和单例。您只需将命令类放入
$this->commands([])数组插入服务提供商的
register()
部分

就像这样:

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

迟做总比不做好

您试图调用
eternaltree:install
,但将命令注册为
install:eternaltree

你的答案是正确的。。。但是没有必要使用
registerCommands()
registerInstallCommands()
方法。通过从
register()
方法中调用
commands()
方法,保持代码精简。

Laravel 5.6说:
向服务提供者类添加类似的
If
语句。

按照您的建议执行:-实现的MyServiceProvider扩展了服务提供者,然后
公共函数寄存器(){//$this->commands([LaravelTypesController::class]);}
-LaravelTypesController使用$signature、$description和handle方法扩展了命令,但仍然没有在php artisan上看到命令| grept Laravel文档说“大多数服务提供程序都包含一个寄存器和一个引导方法。在register方法中,您应该只将内容绑定到服务容器中。您不应尝试在register方法中注册任何事件侦听器、路由或任何其他功能。”。是否应将
$this->commands([…]);
放在
引导()中
method?在我看来,命令注册不包含逻辑,它只是引用命令所在的位置。因此,它与事件注册或功能性不同。但这是我的观点(此解决方案有效:D)。
[InvalidArgumentException] There are no commands defined in the "eternaltree" namespace.
$this->commands('command.eternaltree.install');
$this->commands([
    Acme\MyCommand::class
]);
/**
 * Bootstrap the application services.
 *
 * @return void
 */
public function boot()
{
    if ($this->app->runningInConsole()) {
        $this->commands([
            FooCommand::class,
            BarCommand::class,
        ]);
    }
}