CakePHP(v3.x)、ConsoleCommandを作成する。

CakePHPではsrc/Commandディレクトリ下にコンソールコマンドを追加することができます。 データベースの特定のレコードの数を数えたり、レコードの中のあるステータスを条件に応じて一括で変更するなどといった操作に有効です。

以下、引数にidをとり、そのレコードのうち、nameというカラムを出力するコマンドを書いていきたいと思います。

namespace App\Command;

use Cake\Console\Arguments;
use Cake\Console\Command;
use Cake\Console\ConsoleIo;
use Cake\Console\ConsoleOptionParser;
use Cake\ORM\TableRegistry;

class CallIdCommand extends Command
{
    protected function buildOptionParser(ConsoleOptionParser $parser)
    {
        $parser = parent::buildOptionParser($parser);
        $parser->addArgument("id", [ // id をArgumentsに指定
            'help' => "article id",
            'required' => true
        ]);
        return $parser;
    }

    public function execute(Arguments $args, ConsoleIo $io)
    {
        $id = $args->getArgument('id');
        $client  = TableRegistry::getTableLocator()->get("Clients")->get($id); // argsに渡されたidから特定のレコードをとってくる
        $name = $client->name; // 名前を取得
        $io->out("selected name is {$name}."); // 名前を出力
    }
}

ここで定義したコマンドをコンソールから実行したいときは、 パスカルケースで書かれているクラス名のうち、語尾のCommandを除く部分をスネークケースで叩くだけです。 今回の場合は CallIdCommand -> call_id で実行可能です。加えてargumentを渡す必要があります。

$ bin\cake call_id 1 
>>> selected name is ほげほげ.