Laravelでログインできない問題に詰みました。
筆者は現在、社内システムをLaravelで開発しています。作業中に多くの問題が発生し、解決に時間と労力を費やしました。
そのなかでも特に悩んだ問題は「ログインできない問題」でした。今回はこの難題(笑)をどうやって解決したのかをご紹介します
認証機能はどのように作る?
まず認証機能はどうやって作ったのか?
Laravelにはこの機能を自動生成してくれる以下のコマンドがあります。
php artisan make:auth
このコマンドを打つことによって認証関連のプログラムを一括で用意してくれます。
生成された認証機能はカスタマイズすることが可能なのですが、筆者はここで躓きました。
カスタマイズしたら認証されなくなった。
初期値では「e-mail」で認証するところを「name」にカスタマイズしていました。
どうやって解決したのか?
それぞれのファイルで”e-mail”を”name”に書き換えると、名前で認証できるようになります。その際に必要な設定変更を忘れていたことが原因でした。
//login.blade.php <div class="form-group row"> <label for="email" class="col-sm-4 col-form-label text-md-right">{{ __('E-Mail Address') }}</label> <div class="col-md-6"> <input id="email" type="email" class="form-control @error('email') is-invalid" name="email" value="{{ old('email') }}" required autofocus> @error('email')) <span class="invalid-feedback" role="alert"> <strong>{{ $message }}</strong> </span> @enderror </div> </div>
▼こっちの変更を忘れていた
//LoginController.php public function username() { return 'e-mail'; }
後者のメソッドは「LoginController.php」がimportしている「AuthenticatesUser.php」にある同等のメソッドを上書きしています。
このメソッドに指定されている種別の情報と、入力した情報が一致するとログインできる構造になっています。
この問題の根本原因はなにか?
機能を正確に理解していなかったことだと思っています。コマンド一行で実装できたことからも、ただ利用するだけでよく、中身を理解するまでもないとそのままにしていました。そのせいで些細な記述ミスを解決するためにずいぶんと時間と労力を遣ってしまいました。もし理解していれば問題の出処を予測できたかもしれません。
ではすべてを正確に把握してから実装に乗り出すのが最良かといえば、そうとも限らないと思っています。規模の大きなライブラリとなると複雑な階層構造となり、すべてを理解するのは容易ではありません。ましてや初心者はコードを読むことすら一苦労。わかってから動くのではいつまで経っても始まりません。
少しわかったらテストして、インプットとアウトプットを調査する。それさえわかれば本使用に乗り切ってもいいのではないかと思います。起こる問題のほとんどはインプットかアウトプットに起因していました。つまりこれらふたつさえ把握していれば、問題の発生を抑えることができると思います。といっても現状で実践できているわけではなく、努力目標であるため有効性は未知数です。
終わりに
最初に書いたとおり、詰まった問題はこれに限りません。そのほとんどは些細なタイプミスであったり、パラメータの型を間違えていたりといったものでした。わかってしまえば恥ずかしいミスとすら思えるのですが、悩んでいる最中はまったく見えていません。難航していると思ったら他人に相談して、クリアな視点を借りるようにしたいと思います。