Laravelでサービスプロバイダを追加した場合の、引っ越しにおける注意事項
laravel 5.2 で開発中のプロジェクトの別環境を作ろうとして、しばらく悩んだのでメモです。作業手順は概ね以下の通りです:
- ソースツリーを git で持ってくる
- vendor 配下と composer.lock を消して composer install
- DB ユーザーと DB インスタンスを作成(中身はまだカラの状態)
- php artisan migrate でテーブルを作る
(4) のところで以下のようなエラーが発生:
$ php artisan [Illuminate\Database\QueryException] SQLSTATE[42P01]: Undefined table: 7 ERROR: relation "manuals" does not exist (以下略)
エラーログを遡ると、app/Providers/Ec2ServiceProvider.php という自作のソースが走っており、その中で Manual モデルの初期化に行って、SELECT しようとして引っかかってました。
artisan コンソールアプリをいくつか作って、当初はそれらを app/Console/Kernel.php に登録して使っていたんですが、本格的に使う場合(*1)はサービスプロバイダとして登録するべきらしいということで作ったのがこのファイルでした。
で、サービスプロバイダとして登録すると、php artisan レベルですでに使える状態になっていないといけないということらしいです。
しょうがないので、app/Providers/Ec2ServiceProvider.php の拡張子を .php_ にリネームして見えなくしてみると、今度は以下のエラー:
$ php artisan [Symfony\Component\Debug\Exception\FatalThrowableError] Class 'App\Providers\Ec2ServiceProvider' not found
Ec2ServiceProvider のエントリが config/app.config にいたので、その行をコメントアウト。これでやっと php artisan でコマンドの一覧表が出るようになりました。
その後、php artisan migrate でテーブルを作成し、コメントアウトと拡張子の変更を戻して php artisan すると、自分で作ったコマンドも表示されるようになりました。めでたしめでたし。
$ php artisan | grep ec2 ec2 ec2:autostop インスタンスの自動停止制御 ec2:list EC2 インスタンスの一覧を表示します ec2:reboot インスタンスを再起動します ec2:start インスタンスを起動します ec2:stop インスタンスを停止します
(*1)… Laravel パッケージにコマンドライン機能を含める場合がこれにあたるようです。