Cakephp PHP WEB開発

【Cakephp2→4】シェルからコマンドへ移行する際のテンプレート

※本サイトはPR表記を含みます。

Cake2では、シェル機能があり、コンソール上で実行できましたが、Cake4移行時には、「コマンド」として実装する必要があります。

シェルはCake3.6で非推奨になり、コマンドとして利用するように推奨されています。

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() のみでも簡単に実行可能です。
しかし、オプションパーサーを用いれば、引数やオプションを自由に設定できます。

意図しないエラーを防ぐためにも、検証なども含めた実装にするとよいと思います。

-Cakephp, PHP, WEB開発
-