
Cake2では、シェル機能があり、コンソール上で実行できましたが、Cake4移行時には、「コマンド」として実装する必要があります。
シェルはCake3.6で非推奨になり、コマンドとして利用するように推奨されています。
■ Cake3: シェルは非推奨に
https://book.cakephp.org/3/ja/console-and-shells/shells.html
Cakephp2のシェルで実装されていたものを、コマンドとして移行させる際、コマンドの大まかなテンプレートを示しました。
Cake4: コマンドのテンプレート例
<?php
declare(strict_types=1);
namespace App\Command;
use Cake\Console\Arguments;
use Cake\Console\Command;
use Cake\Console\ConsoleIo;
use Cake\Console\ConsoleOptionParser;
/**
* テンプレコマンドコンソール
*
*
* 実行コマンド: ./bin/cake hoge fugaMethod
*/
class HogeCommand extends Command
{
/**
* オプションパーサー
*
* フックメソッドで引数やオプションを定義する
*
* @param \Cake\Console\ConsoleOptionParser $parser 引数やオプションを定義
* @return \Cake\Console\ConsoleOptionParser コマンド定義されたオブジェクト
*/
protected function buildOptionParser(ConsoleOptionParser $parser): ConsoleOptionParser
{
$parser = parent::buildOptionParser($parser);
$parser->addArgument('command', ['help' => 'fugaMethod', 'required' => true]);
return $parser;
}
/**
* コマンドが呼び出された時に実行
*
* @param \Cake\Console\Arguments $args コマンド引数
* @param \Cake\Console\ConsoleIo $io 対話形式で出力したりファイル作成などを提供
* @return void
*/
public function execute(Arguments $args, ConsoleIo $io): void
{
$command = $args->getArgument('command');
if ($command !== ' fugaMethod') {
$io->error('コマンド指定が違います');
$this->abort();
}
// コマンド指定にエラーがなければメソッド実行
$this->fugaMethod();
}
/**
* テストメソッド
*
* @return void
*/
public function fugaMethod(): void
{
debug('test');
exit;
}
}
コンソール上で実行してみる
command
$ ./bin/cake hoge fugaMethod
以下のような実行結果に
result
APP/Command/HogeCommand.php
########## DEBUG ##########
'test'
###########################
コンソール上でわざとメソッドを間違えるテスト
command
$ ./bin/cake hoge fugas
result
コマンド指定が違います
Cake4でコマンドを作成する方法は、execute() のみでも簡単に実行可能です。
しかし、オプションパーサーを用いれば、引数やオプションを自由に設定できます。
意図しないエラーを防ぐためにも、検証なども含めた実装にするとよいと思います。
■ Cakephp4: コマンド
https://book.cakephp.org/4/ja/console-commands/commands.html