Laravelのクラス名の大文字と小文字でハマった記録

2019-12-28 |
2019-12-29



仕事でLaravelをつかっていたときにしでかしたミスについて書いていきます。

自分の勘違いもあって原因を特定するのに時間がかかってしまったので、繰り返すまい!という気持ちで書いていこうと思います。

開発環境では起きないエラーが本番環境で起きる

ローカルはWindowsでLaravelをつかって開発していました。

ローカルでだいたい開発がおわったので、本番環境のCentOSのサーバにソースコードをうつしました。

そこで、実際に稼働させてみたところなぜかエラーが…

hogeControllerがないよ!

こんなかんじのエラーメッセージでした。

HogeControllerはたしかにつかってるけど、どうしてhogeControllerを参照しているんだ??

といったかんじで、なんでControllerの頭文字が小文字になっているんだ…?と不思議に思いました。

自分の勘違いで遠回りがおきる

当時の状況を思い出すと、

ローカルでエラーが起きていないから、自分のコードに原因はなさそう(勘違い)

ローカルと本番で環境が違うからLaravelがうまくうごいていないのではないか(勘違い)

そしてLaravelのソースコードをみてみたりと見当違いなところを調査する…

こんなかんじで、自分のソースコードにバグが有るという一番可能性のある場合を調査するのが後回しになってしまいました。

Laravelの命名規則的にControllerの名前はPascalCaseで書くため、基本的にそのように書いていました。

エラーメッセージの内容が、 このコントローラクラスはないよ! って感じでどこかのメソッドがバグっているわけでもなく、ローカルで動いていたことから、本番環境にしたことで自分が考慮できていないなにかが原因なのではないかと考えてしまいました。

その結果、Laravelのほうに問題があるのでは?というめちゃくちゃな考えになってしまいました。

エラーの原因

WindowsとCentOS、そして大文字、小文字

おそらくですが、この組み合わせだけでピンと来た方がいっぱいいらっしゃいそうです。

まず、WindowsとCentOSでは大文字、小文字の扱いが違います。

私は当時そのことを知りませんでした…

Windowsはファイル名の大文字、小文字を区別しません。
現在は設定によって区別できるようになるみたいですが、私の環境では区別していませんでした。

そして、CentOSことUNIX系ではファイル名の大文字と小文字を区別します。

Windowsのローカルで動いて、CentOSの本番環境で動かなったというのは、
Windowsが大文字小文字を区別していなかったからhogeControllerと書いてもHogeControllerクラスのファイルを参照してくれていましたが、CentOSの本番環境ではhogeControllerと書いてしまったら、HogeControllerクラスのファイルを参照しないことが原因でした。

つまり、私が本来HogeControllerとかくべきところを、hogeControllerと書いてしまっていたのが原因でした。

実際にバグらせていたところはルーティングのところで、一箇所だけhogeControllerクラスから処理を呼び出していました。

反省

フタを開けてみれば、自分の打ち間違いが原因でした。

しかも、大文字で書くところを小文字で書いてしまったというめちゃくちゃしょうもないことが原因でした。

そのしょうもない原因を特定するために2~3時間ほど費やしてしまったので反省です。

原因を調査するときはまずは自分が間違えている可能性を調べないといけないと肝に銘じました。

また、WindowsやLinux、UNIXといったOSの違いの学習まで手が回っていないなぁと感じました。

おわりに

このエラーに遭遇したときにLaravelを使っていたので、タイトルにLaravelを入れましたが、ローカルと本番でOSが違えばいつでも起こりうるのでちゃんと覚えておかないとなと思いました。

また、エラーの原因を調査するときはまずは自分が間違えているという可能性を先に調べるということを徹底しようと思いました。

Please share, if you like this.