【问题标题】:Laravel custom artisan command not listedLaravel 自定义工匠命令未列出
【发布时间】:2019-09-19 08:44:07
【问题描述】:

我写了几个工匠命令。
它们都有共同的功能,所以我没有扩展 Command 类,而是编写了一个 MyBaseCommand 类,所以所有命令都扩展了这个:

namespace App\Console\Commands;
use Illuminate\Console\Command;

class SomeCommand extends MyBaseCommand
{
    protected $signature = 'mycommands:command1';

    protected $description = 'Some description';

    :
    :

还有基类:

namespace App\Console\Commands;

class MyBaseCommand extends Command
{
    :
    :

问题是由于某种原因这些命令不再以php artisan 列出。

知道如何强制 laravel 也列出这些命令吗?

【问题讨论】:

  • MyBaseCommand 是否扩展了 Laravel 的基础 Command 类?
  • 您能否发布一些基类及其子类的示例代码?还有你的签名是什么样子的?您的命令是否也注册在 commands 方法或 commands 属性中?
  • @aken-roberts,是的 - 我刚刚更新了问题。
  • @superkevin,我没有在任何地方注册我的课程。但是,当它们直接扩展 Command 类时,它们被列出了。
  • @guyaloni 您需要在kernel.php 中注册所有子命令类,即使您扩展了基本命令类。 Laravel 检查该文件以列出所有自定义命令。

标签: laravel laravel-artisan


【解决方案1】:
protected $signature = 'mycommands:command1'; //this is your command name

打开app\Console\kernel.php 文件。

protected $commands = [
    \App\Console\Commands\SomeCommand::class,
]

然后运行

php artisan list

【讨论】:

  • 它不起作用,除非我直接从Command 扩展类(然后我不需要列出它们)
【解决方案2】:

Laravel 尝试自动为你注册命令:

/**
 * Register the commands for the application.
 *
 * @return void
 */
protected function commands()
{
    $this->load(__DIR__.'/Commands');

    require base_path('routes/console.php');
}

你可以在App\Console\Kernel.php找到这个

确保您的类具有 signaturedescription 属性。

【讨论】:

  • 看起来您在父类中缺少use Illuminate\Console\Command;,而您在子类中缺少@guyaloni
  • 据我所知没有必要(PhpStorm 还告诉我如果添加它就永远不会使用它)。无论如何,即使我添加它,我也没有看到它列出来。
  • @guyaloni 如果 laravel 没有通过读取文件夹来获取它,您需要通过在 $commands 数组中定义它来注册它。
【解决方案3】:

这很愚蠢,因为它可能会发生在其他人身上,所以我在这里留下答案:

我想隐藏基类,所以我在里面有这行:

protected $hidden = true;

当然,这个变量的值被传播到高级类,是什么隐藏了自定义命令。

解决方案就是在这些文件中添加这一行:

protected $hidden = false;

=======================更新======================

正如@aken-roberts 所说,更好的解决方案是简单地将基类抽象化:

namespace App\Console\Commands;

abstract class MyBaseCommand extends Command
{

    abstract public function handle();

    :
    :

在这种情况下,artisan 没有列出它,并且无法执行。

【讨论】:

  • 使您的MyBaseCommand 类抽象,它不会注册为命令。
猜你喜欢
  • 1970-01-01
  • 2015-04-06
  • 1970-01-01
  • 2020-07-09
  • 2014-08-30
  • 1970-01-01
  • 2014-09-07
  • 2017-12-24
  • 2022-08-10
相关资源
最近更新 更多