はじめに
CodeIgniter4 で Shield を導入する際、マイグレーションが適用されず、settings テーブルが作成されない問題に直面しました。本記事では、その原因と解決策を共有します。
発生した問題
php spark migrate:status を実行すると、以下のように Shield と Settings のマイグレーションが認識されているにも関わらず、適用されていない状態が続きました。
$ php spark migrate:status
+----------------------+-------------------+---------------------+----------+--------+--------+
| 名前空間 | バージョン | ファイル名 | グループ | 移行日 | バッチ |
+----------------------+-------------------+---------------------+----------+--------+--------+
| CodeIgniter\Shield | 2020-12-28-223112 | create_auth_tables | --- | --- | --- |
| CodeIgniter\Settings | 2021-07-04-041948 | CreateSettingsTable | --- | --- | --- |
| CodeIgniter\Settings | 2021-11-14-143905 | AddContextColumn | --- | --- | --- |
+----------------------+-------------------+---------------------+----------+--------+--------+
マイグレーションを適用しようとしても、特にエラーは発生せず マイグレーションが完了しました と表示されるものの、データベースには何も適用されていない状態でした。
原因
原因は Myth/Auth がインストールされていたこと でした。
CodeIgniter 4 では Myth/Auth と Shield はどちらも認証ライブラリですが、それぞれ users テーブルや auth_* 系のテーブルを作成するため、競合が発生します。
Myth/Auth のマイグレーションが適用されていると Shield のマイグレーションが適用されないケースがあるため、Myth/Auth を削除することで Shield のマイグレーションが正常に適用されるようになりました。
解決策
1. Myth/Auth がインストールされているか確認
$ composer show | grep myth/auth
上記のコマンドで myth/auth が表示される場合、インストールされています。
2. Myth/Auth をアンインストール
$ composer remove myth/auth
3. マイグレーションのリセット
既存のマイグレーションをリセットします。
$ php spark migrate:reset
4. Shield のマイグレーションを適用
$ php spark migrate --namespace CodeIgniter\Shield
$ php spark migrate --namespace CodeIgniter\Settings
これで、Shield と Settings のマイグレーションが正常に適用され、settings テーブルも作成されるはずです。
おわりに
同様の問題に直面している方の参考になれば幸いです。Myth/Auth と Shield の競合に注意し、適切なマイグレーションの適用を行ってください。