0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

CodeIgniter 4のapp/commandsに__construct()を定義したら、0から環境構築の際にmigrateで失敗した

Last updated at Posted at 2025-03-11

はじめに

先日、Codeigniter 4のsparkコマンドで使用する際のコマンドを作成した所、バグが発生してしまいました。
あまりやってこなかったアウトプットというのをしてみようと思い、せっかくなので報告を受けたバグを記事にしてみる事にしました。

コマンドの概略

  • CSVからデータをインポートするためのコマンド
  • 既にテーブルにデータが存在する場合は、スキップする

処理の概要

  • コンストラクタ(__construct())では、現在のテーブルのデータを取得して、プロパティ(メンバー変数)展開する
  • 本処理(run)では、その展開した中をチェックして処理を行う

※コンストラクタをあまり使う機会が無かったので、せっかくなので現在のテーブルを取得して展開しておく際にコンストラクタを使用した

事象

  • 何故かmigrateの実行時にエラーが発生した。
  • 開発途中の環境では、migrateは問題なく動作が完了した。
  • 0から環境構築をした際に、migrateが失敗する事が判明した。

原因

  • 各migrateを行って、最終的にインポート用のコマンドを実行するような順序を想定していた。
  • Codeigniter 4の仕様としては、php spark migrateを実行すると、app/commands配下の各クラスがすべてロードされるため、想定していた実行順序と仕様が噛み合っていなかった。
  • テーブルを展開したくても、環境構築が0からの場合は、テーブルそのものが存在しないので、失敗する。

対策

仕方ないので、コマンドのコンストラクタに記述していた処理をまるっとrunに移動しました。

疑問

それぞれのコマンドのためのコンストラクタがmigrate時に全実行されるというのは、果たしてベストプラクティスな実装なのか。
周りに質問してみたところ、「コンストラクタ全実行は想定外で、仕様としては好ましくない気がする。」とのことだった。ただ、何か理由があってこの形になっているのかが気になった。
私自身もそれぞれのコマンドを実行した際にだけ、コンストラクタが実行されると思っていたので、想定外の事象だった。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?