CakePHP 4.0 可重用控制台(以前的任务)

CakePHP 4.0 Reusable Console (former Task)

我正在将 CakePHP 2 系统升级到 CakePHP 4,我有一段代码可以在服务台系统中打开工单,具有 public 功能来打开、更新、解决等

之前我使用 Tasks 实现了这个(因为它是通过控制台触发的),现在 tasks 被弃用了,最好把它放在哪里?

在版本 4.x 中是否仍然可以使用 $useTable = false 来创建没有表格的模型?

我看过 Consoles inside Consoles,但看起来很乱,我还没有弄清楚如何在目标控制台内调用特定功能。

非常感谢。

一切都是命令

现在一切都是命令,几乎可以在任何地方实例化它们,子命令过程没有自动化,现在如何构建界面完全取决于你。

恕我直言,一个命令不应该有很多不同的 public 入口点,但理想情况下只做一件事,所以你只需执行命令来做 x,然后不要不要调用 xyz 来做很多不同的事情。

正在手动执行命令

从命令执行命令非常简单,命令 classes 有一个辅助方法:

$exitCode = $this->executeCommand(
    \App\Command\MySubcommand::class,
    ['--option', 'argument']
);

如果命令需要构造函数参数,您可以传递命令的实例:

$subCommand = new \App\Command\MySubcommand($constructorArguments);
$exitCode = $this->executeCommand($subCommand, ['--option', 'argument']);

这样做非常好,您可以在需要时 运行 这样的命令。

向 CLI 公开命令

要使用适当的名称向 CLI 公开子命令,最简单的方法是覆盖命令中的默认名称 class。假设你的父命令的名称是 ParentCommand,它在你的子命令中可能看起来像这样 class:

public static function defaultName(): string
{
    return 'parent sub';
}

然后您可以通过 bin/cake parent sub 调用该命令,相应地通过 bin/cake parent 调用父命令。

为了更好地控制命令的注册方式,您可以在您的应用程序 class 中使用 console() 挂钩,您可以完全控制正在加载的内容和名称。例如,这将仅注册 parent 命令和 parent sub 命令:

// in src/Application.php

public function console(\Cake\Console\CommandCollection $commands): \Cake\Console\CommandCollection
{
    // autoload app and core commands
    // $commands = parent::console($commands);

    // register commands with custom names
    $commands->add(
        'parent',
        \App\Command\ParentCommand::class
    );
    $commands->add(
        'parent sub',
        \App\Command\ParentSubCommand::class
    );

    return $commands;
}

另见