Cakephp 3:从命令执行自定义命令
Cakephp 3: execute custom command from command
在 CakPHP 3.6.0 中添加了 Console Commands 以长期替换 Shell 和任务。
我目前正在设计一个 cronjob 命令,以在不同的时间间隔执行其他命令。所以我想 运行 来自命令 class 的命令,如下所示:
namespace App\Command;
// ...
class CronjobCommand extends Command
{
public function execute(Arguments $args, ConsoleIo $io)
{
// Run other command
}
}
对于外壳/任务,可以使用 Cake\Console\ShellDispatcher
:
$shell = new ShellDispatcher();
$output = $shell->run(['cake', $task]);
但这不适用于命令。由于我没有在文档中找到任何信息,有什么解决这个问题的想法吗?
您可以简单地实例化命令,然后 运行 它,如下所示:
try {
$otherCommand = new \App\Command\OtherCommand();
$result = $otherCommand->run(['--foo', 'bar'], $io);
} catch (\Cake\Console\Exception\StopException $e) {
$result = $e->getCode();
}
CakePHP 3.8 将引入一个方便的方法来帮助解决这个问题。引用即将发布的文档:
You may need to call other commands from your command. You can use
executeCommand
to do that::
// You can pass an array of CLI options and arguments.
$this->executeCommand(OtherCommand::class, ['--verbose', 'deploy']);
// Can pass an instance of the command if it has constructor args
$command = new OtherCommand($otherArgs);
$this->executeCommand($command, ['--verbose', 'deploy']);
在 CakPHP 3.6.0 中添加了 Console Commands 以长期替换 Shell 和任务。
我目前正在设计一个 cronjob 命令,以在不同的时间间隔执行其他命令。所以我想 运行 来自命令 class 的命令,如下所示:
namespace App\Command;
// ...
class CronjobCommand extends Command
{
public function execute(Arguments $args, ConsoleIo $io)
{
// Run other command
}
}
对于外壳/任务,可以使用 Cake\Console\ShellDispatcher
:
$shell = new ShellDispatcher();
$output = $shell->run(['cake', $task]);
但这不适用于命令。由于我没有在文档中找到任何信息,有什么解决这个问题的想法吗?
您可以简单地实例化命令,然后 运行 它,如下所示:
try {
$otherCommand = new \App\Command\OtherCommand();
$result = $otherCommand->run(['--foo', 'bar'], $io);
} catch (\Cake\Console\Exception\StopException $e) {
$result = $e->getCode();
}
CakePHP 3.8 将引入一个方便的方法来帮助解决这个问题。引用即将发布的文档:
You may need to call other commands from your command. You can use
executeCommand
to do that::// You can pass an array of CLI options and arguments. $this->executeCommand(OtherCommand::class, ['--verbose', 'deploy']); // Can pass an instance of the command if it has constructor args $command = new OtherCommand($otherArgs); $this->executeCommand($command, ['--verbose', 'deploy']);