michihide's blog

技術メモおよび雑感

Laravelでサービスプロバイダを追加した場合の、引っ越しにおける注意事項

laravel 5.2 で開発中のプロジェクトの別環境を作ろうとして、しばらく悩んだのでメモです。作業手順は概ね以下の通りです:

  1. ソースツリーを git で持ってくる
  2. vendor 配下と composer.lock を消して composer install
  3. DB ユーザーと DB インスタンスを作成(中身はまだカラの状態)
  4. 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 パッケージにコマンドライン機能を含める場合がこれにあたるようです。