Php 如何从Laravel 5中的包注册控制台命令?
自从Laravel5以来,我很感兴趣——如何从Laravel5的包中注册和使用console命令 正如在laracast中所讨论的,我创建了一个目录结构,将我的包添加到autoload并创建了一个服务提供者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
<?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,
]);
}
}