laravel5.1の落とし穴(いままで動いてたのに、急に動かなくなった時の対処法)
問題その1、とりあえず、よく分からなかったら、このコマンド!
composer dump-autoload
スペルミスなどでクラス名を変更した時に実行すると幸せになれる。
laravelプロジェクトでは、composerがクラス管理をしているためIDEやエディタから手動で変更すると不整合が起こる!
http://nextat.co.jp/staff/archives/121
※それでもダメな場合は、phpMyAdminでテーブルを全削除してみたら上手く行った
Q, phpのautoloadって何よ?
https://blog.katty.in/1942
A, 以下の様な経緯で、こうなった
1, 以前のPHPでは、includeなどで他のクラスやファイルを読み込んでいた。(使いたいクラスがある場合はincludeしないと使えない)
2, 分かりやすい反面、数が多くなったり依存関係がある場合には、手動で設定するのはバグの原因となる。
3, そこで使っているクラスは、自動的にincludeしておいてよ!というのがautoload(自動ロード)
4, プロジェクトルート直下にあるcomposer.jsonの設定に従う。appフォルダ以下にあるクラスは自動的に使える。
1 2 3 4 5 6 7 8 9 |
"autoload": { "classmap": [ "database", "app/helpers" ], "psr-4": { "App\\": "app/" } }, |
Q2, psr-4って何?
Q2, PSR-4 はオートローダーに関する規約名(その前のバージョンはpsr-0と番号的には、結構すっとばしている)。
ここにパスを追加しておくと、そこにあるクラスファイルについてはincludeしなくても使える。
Q3, でも、use App\User;とか先頭に書かないと、Userクラスが使えないんだけど?
A3, これは名前空間の問題。名前空間(name space)とは、ファイルのフルパスと同じ考え方です(同じ名前があってもいいけど、フルパスは違わないとダメ!)
laravel5.1では、モデルクラスはどこにおいてもいいけどAppフォルダ直下に置くのが一般的。
つまり、$query = App\User::query(); とフルパス記述すれば、ファイルのuse App\User;は不要
(先頭に書いておけば、毎回フルパスで書かなくても良い。環境変数のPATHと同じ考え方)
Q4, クラス名やファイル名を書き換えると起こる不整合って、具体的に何なの?
A4, 動作時のautoloadの設定ファイルは以下にある。
/vendor/composer/autoload_classmap.php
実ファイルだけ変更してコッチが変更されてないと不整合。このファイルを上書き設定してくれるコマンドがcomposer dump-autoload
問題その2、laravelのキャッシュについて
Q1, configフォルダ内のapp.phpなどの設定ファイルを変更しても、システムに反映されない!
A1, おそらく、php artisan config:cacheを以前に実行している。このコマンドはconfigフォルダ以下に複数ある設定ファイルを、1ファイル(bootstrap/cache/config.php)にまとめて、高速化を図る(デプロイやリリース時に行うのが良い)
以降は、1ファイルの方を参照するので、もとのconfigファイルを修正してもダメ!
Q2, 元の状態に戻せないの?
A2, php artisan config:clear でbootstrap/cache/config.phpが削除されて、元に戻る。
同じようなのにroute:cacheってのもある
問題その3、よく分からないけど、急に動かなくなった。
Q1, なぜかパッケージ(ライブラリ)が消えている…。
A1, php artisan vendor:publish で、再ダウンロードされる。composer.jsonを手動でいじったりした?