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

nnsrf1az  于 2022-11-12  发布在  PHP
关注(0)|答案(1)|浏览(96)

我正在将一个CakePHP 2系统升级到CakePHP 4,我有一段代码可以在帮助台系统中打开票证,并使用公共函数来打开、更新、解析等
以前我使用Tasks实现了这一点(因为它是通过控制台触发的),现在tasks被弃用了,把它放在哪里是最好的?
此外,在4.x版本中,是否仍然可以使用$useTable = false来拥有没有表的模型?
我看过控制台内部的控制台,但它似乎很混乱,我还没有弄清楚如何调用目标控制台内部的特定函数。
多谢了。

ut6juiuv

ut6juiuv1#

一切都是命令
现在所有的东西都是一个命令,它们几乎可以在你喜欢的任何地方被示例化,子命令过程没有自动化,如何构建界面完全取决于你。
恕我直言,一个命令不应该有很多不同的公共入口点,但理想的情况是只做一件事,所以你只需要执行命令做 x,而不要在上面调用 xyz 来做很多不同的事情。

手动执行命令

从一个命令执行一个命令非常简单,命令类有一个helper方法:

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

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

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

这是完全可以做到的,你可以在需要的时候运行你的命令。

向CLI公开命令

要使用正确的名称向CLI公开子命令,最简单的方法是覆盖命令类中的默认名称。假设父命令的名称为ParentCommand,则在子命令类中它可能如下所示:

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

然后,您可以相应地通过bin/cake parent sub调用该命令,并通过bin/cake parent调用父命令。
为了更好地控制命令的注册方式,你可以在应用程序类中使用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;
}

另请参阅

*Cookbook〉控制台命令〉命令对象〉调用其他命令
*Cookbook〉控制台命令〉命令对象〉更改默认命令名
*Cookbook〉控制台命令〉控制台应用程序

相关问题