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']);

另见 https://github.com/cakephp/cakephp/pull/13163