はじめに
先日、Codeigniter 4のsparkコマンドで使用する際のコマンドを作成した所、バグが発生してしまいました。
あまりやってこなかったアウトプットというのをしてみようと思い、せっかくなので報告を受けたバグを記事にしてみる事にしました。
コマンドの概略
- CSVからデータをインポートするためのコマンド
- 既にテーブルにデータが存在する場合は、スキップする
処理の概要
- コンストラクタ(
__construct()
)では、現在のテーブルのデータを取得して、プロパティ(メンバー変数)展開する - 本処理(
run
)では、その展開した中をチェックして処理を行う
※コンストラクタをあまり使う機会が無かったので、せっかくなので現在のテーブルを取得して展開しておく際にコンストラクタを使用した
事象
- 何故かmigrateの実行時にエラーが発生した。
- 開発途中の環境では、migrateは問題なく動作が完了した。
- 0から環境構築をした際に、migrateが失敗する事が判明した。
原因
- 各migrateを行って、最終的にインポート用のコマンドを実行するような順序を想定していた。
- Codeigniter 4の仕様としては、
php spark migrate
を実行すると、app/commands
配下の各クラスがすべてロードされるため、想定していた実行順序と仕様が噛み合っていなかった。 - テーブルを展開したくても、環境構築が0からの場合は、テーブルそのものが存在しないので、失敗する。
対策
仕方ないので、コマンドのコンストラクタに記述していた処理をまるっとrun
に移動しました。
疑問
それぞれのコマンドのためのコンストラクタがmigrate時に全実行されるというのは、果たしてベストプラクティスな実装なのか。
周りに質問してみたところ、「コンストラクタ全実行は想定外で、仕様としては好ましくない気がする。」とのことだった。ただ、何か理由があってこの形になっているのかが気になった。
私自身もそれぞれのコマンドを実行した際にだけ、コンストラクタが実行されると思っていたので、想定外の事象だった。