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,然后不要不要调用 x 和 y 和 z 来做很多不同的事情。
正在手动执行命令
从命令执行命令非常简单,命令 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;
}
另见
我正在将 CakePHP 2 系统升级到 CakePHP 4,我有一段代码可以在服务台系统中打开工单,具有 public 功能来打开、更新、解决等
之前我使用 Tasks 实现了这个(因为它是通过控制台触发的),现在 tasks 被弃用了,最好把它放在哪里?
在版本 4.x 中是否仍然可以使用 $useTable = false 来创建没有表格的模型?
我看过 Consoles inside Consoles,但看起来很乱,我还没有弄清楚如何在目标控制台内调用特定功能。
非常感谢。
一切都是命令
现在一切都是命令,几乎可以在任何地方实例化它们,子命令过程没有自动化,现在如何构建界面完全取决于你。
恕我直言,一个命令不应该有很多不同的 public 入口点,但理想情况下只做一件事,所以你只需执行命令来做 x,然后不要不要调用 x 和 y 和 z 来做很多不同的事情。
正在手动执行命令
从命令执行命令非常简单,命令 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;
}