CakePHPを用いたバッチ開発

Advent Calendar 2022

この記事は最終更新日から1年以上が経過しています。

はじめに

株式会社レコチョクでバックエンドエンジニアをしている早瀬です。
新卒3年目で、普段はmurketのフロントやAPIの開発を主に行っています。
好きなバンドは UNISON SQUARE GARDEN, ill hiss clover, phatmans after schoolです。
先日CakePHPのコマンドオブジェクトを初めて触ったので、本記事ではコマンドオブジェクトの使い方などについて触れていこうかと思います。
本記事で取り扱うCakePHPは4.x系です。

コマンドオブジェクト

CakePHPでバッチを作成する際には、コマンドオブジェクトを使用します。
コマンドオブジェクトはbakeコマンドを実行することで作成することができます。

Hello Worldを実装してみる

例としてHello World!を実装してみます。
以下コマンドを実行します。

すると、 src/commandディレクトリの中に HelloCommand.phpが生成されます。
以下コードがコマンドを実装する際の雛形になります。
( tests/TestCase/Commandディレクトリの中に HelloCommandTest.phpも生成されますが、今回は触れないものとします。)

Hello Worldを実装するために execute()の中身に以下を追加します。

ターミナルで以下コマンドを実行すると実行結果はこのようになると思います。

コマンドオブジェクトを実行する場合は ./bin/cake helloのように、クラス名から”Command”を除いた部分をキャメルケースで入力することで実行できます。
クラス名が replaceTitleCommandの場合は ./bin/cake replaceTitleという形で入力すると実行できます。

オプションで処理を切り替える

コマンドオブジェクトはオプションを用いることで、処理を分岐させることができます。
以下プログラムは検証環境と本番環境によって処理を切り替える例です。

上記ファイルを実行すると以下のようになります。

buildOption()

buildOptionsはコマンドラインで指定できるオプションの設定を記載します。

addOption()の第1引数で使用したいオプション名を、第2引数ではオプションを指定できます。
また、addArgument()は引数として取る値の設定をできます。

addOption(),addArguments()の第2引数で helpを設定すると、 --helpを実行した際に説明を表示できます。

execute()

executeはコマンドラインで実行する際に実際に行われる処理を記述する場所です。

getOption()を実行することでオプションの値を取ることができ、getArgument()を使用すると引数の値を取得できます。
addOption()の第2引数でboolean =>trueを選択していた場合、オプションが指定されていればtrue, 指定されていなければfalseになります。
booleanを指定していない場合は、コマンドラインから直接値を受け取ることができます。

DBを利用する

バッチ開発をするにあたって、サービスで使っているデータベースの中身を書き換えるようなバッチを作成したいと言う場合もありえます。
コマンドオブジェクトではTableオブジェクトを使用することができるので、サービスで使用中のDBに対しても処理を行うことも可能です。
Tableオブジェクトが存在しない場合はbakeコマンドから作成することができます。

テーブルオブジェクトの取得はinitialize()で実行すると、後述処理が楽に記述できます。
initialize()はオブジェクトのコンストラクタに当たる部分で、execute()が実行される前に呼び出される処理です。
getTableLocatorを使用してテーブルオブジェクトを呼び出すことで、実務で使用しているDBにアクセスすることができます。

Componentを使用する

コマンドオブジェクトからテーブルオブジェクトを呼び出すことができるように、コマンドオブジェクトからComponentの呼び出しも可能です。

ComponentRegistryを用いることで、サービスで利用しているComponentを呼び出すこともできます。
こちらも他の関数で使用できるようにinitialize()で呼び出すと、プライベート関数内でも呼び出すことができるため便利です。

まとめ

CakePHPのコマンドオブジェクトを用いたバッチ開発方法をまとめました。
特にComponentの使用については公式ドキュメントに記載されていないので、CakePHP初学者は詰まるポイントの1つかと思われます。
バッチをCakePHPで実装しようとしている人の手助けになれば幸いです。

最後まで読んでいただきありがとうございました。
本記事をもってレコチョク Advent Calendar 2022を終了したいと思います。
ここまでお付き合いいただき、誠にありがとうございました。