我正在将一个CakePHP 2系统升级到CakePHP 4,我有一段代码可以在帮助台系统中打开票证,并使用公共函数来打开、更新、解析等以前我使用Tasks实现了这一点(因为它是通过控制台触发的),现在tasks被弃用了,把它放在哪里是最好的?此外,在4.x版本中,是否仍然可以使用$useTable = false来拥有没有表的模型?我看过控制台内部的控制台,但它似乎很混乱,我还没有弄清楚如何调用目标控制台内部的特定函数。多谢了。
ut6juiuv1#
一切都是命令现在所有的东西都是一个命令,它们几乎可以在你喜欢的任何地方被示例化,子命令过程没有自动化,如何构建界面完全取决于你。恕我直言,一个命令不应该有很多不同的公共入口点,但理想的情况是只做一件事,所以你只需要执行命令做 x,而不要在上面调用 x、y 和 z 来做很多不同的事情。
从一个命令执行一个命令非常简单,命令类有一个helper方法:
$exitCode = $this->executeCommand( \App\Command\MySubcommand::class, ['--option', 'argument'] );
如果命令需要构造函数参数,则可以传递命令的示例:
$subCommand = new \App\Command\MySubcommand($constructorArguments); $exitCode = $this->executeCommand($subCommand, ['--option', 'argument']);
这是完全可以做到的,你可以在需要的时候运行你的命令。
要使用正确的名称向CLI公开子命令,最简单的方法是覆盖命令类中的默认名称。假设父命令的名称为ParentCommand,则在子命令类中它可能如下所示:
ParentCommand
public static function defaultName(): string { return 'parent sub'; }
然后,您可以相应地通过bin/cake parent sub调用该命令,并通过bin/cake parent调用父命令。为了更好地控制命令的注册方式,你可以在应用程序类中使用console()钩子,在那里你可以完全控制加载的内容和名称。例如,这将只注册parent命令和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〉控制台命令〉控制台应用程序
1条答案
按热度按时间ut6juiuv1#
一切都是命令
现在所有的东西都是一个命令,它们几乎可以在你喜欢的任何地方被示例化,子命令过程没有自动化,如何构建界面完全取决于你。
恕我直言,一个命令不应该有很多不同的公共入口点,但理想的情况是只做一件事,所以你只需要执行命令做 x,而不要在上面调用 x、y 和 z 来做很多不同的事情。
手动执行命令
从一个命令执行一个命令非常简单,命令类有一个helper方法:
如果命令需要构造函数参数,则可以传递命令的示例:
这是完全可以做到的,你可以在需要的时候运行你的命令。
向CLI公开命令
要使用正确的名称向CLI公开子命令,最简单的方法是覆盖命令类中的默认名称。假设父命令的名称为
ParentCommand
,则在子命令类中它可能如下所示:然后,您可以相应地通过
bin/cake parent sub
调用该命令,并通过bin/cake parent
调用父命令。为了更好地控制命令的注册方式,你可以在应用程序类中使用
console()
钩子,在那里你可以完全控制加载的内容和名称。例如,这将只注册parent
命令和parent sub
命令:另请参阅
*Cookbook〉控制台命令〉命令对象〉调用其他命令
*Cookbook〉控制台命令〉命令对象〉更改默认命令名
*Cookbook〉控制台命令〉控制台应用程序