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