引き続きLaravel5.4での標準機能を利用した認証機能の実装を行います。
今回はログイン、ログアウト処理の実装です。
なお動作サンプルはコチラにありますので参考にして下さい。
また、本連載で作成または編集したファイルは(ほぼ)コチラに掲載しております。
目次
ログイン処理の実装
まずはログイン処理の実装から。
ログインフォームの準備
ログインフォーム用のビューを作成します。
以下の内容のファイルを「resources/views/user」配下に「login.blade.php」として作成します。
ログインはメールアドレスとパスワードにて行います。
ログイン用の要素以外に、パスワード初期化手続きや新規利用登録へのリンクボタンも配置しています。
ログインフォームの表示
さて、この状態で「/user/login」を表示すると「View [auth.login] not found.」というエラーが発生します。
新規利用登録フォームの表示時と同様に参照されているリソースを変更します。
作成したリソースを利用する場合、「app/Http/Controllers/User/LoginController.php」にて「showLoginForm」を次の内容でオーバライドして変更します。
エラーメッセージの修正
さて、エラーメッセージも新規利用登録フォームの表示時と同様に要素名がそのまま表示されていますので修正します。
「app/Http/Controllers/User/LoginController.php」にて「validateLogin」を次の内容でオーバーライドします。
新規利用登録時と同様の対応です。
なお、このままログイン処理を実行するとエラーが発生します。
原因はvalidateLoginの引数として「Request $request」が指定されていますが、このRequestクラスの利用に関する設定が漏れている為です。
その為、以下の様にUSE演算子を使いインポートします。
ログイン成功後のリダイレクト先の修正
デフォルト状態ではログイン成功後のリダイレクト先が「/home」と設定されていますので、これを「/user/home」へ修正します。
ログイン済みの場合自動的にリダイレクトされるホームの修正
さて、ログイン状態で「/user/login」のように「guest」状態でアクセスする事を前提にしている画面へアクセスすると、自動的にホーム画面へリダイレクトされます。
しかし、実際に挙動を確認すると設定したホ−ムである「/user/home」ではなく「/home」へリダイレクトされている事がわかります。
これは「app/Http/Middleware/RedirectIfAuthenticated.php」内の処理を見るとわかるのですが、認証済みの状態であった場合のリダイレクト先が「/home」としてハードコーディングされている為です。
これを以下のように修正し、正しく「/user/home」へリダイレクトされるように変更します。
未ログイン状態で要ログインページを参照した場合の処理の修正
先ほどはログイン状態で「guest」状態でアクセスする事を前提にしている画面へアクセスした場合のリダイレクト先を修正しました。
逆に未ログイン状態で要ログインのページ(例えば「/user/home」等)を閲覧した場合はどうなるでしょうか。
実際の挙動を確認すると自動的にログインページにリダイレクトされ、ログイン後に該当ページを表示するという流れのようです。
但し、既存の実装ではログインページが「route(‘login’)」として指定されており、本実装では正しく動作しません。
そこで、この部分を処理している「app/Exceptions/Handler.php」以下のように修正し、正しく「/user/home」へリダイレクトされるように変更します。
ログアウト処理の実装
次にログアウト処理を実装します。
ログアウト後のリダイレクト先の変更
デフォルトではログアウト後はトップにリダイレクトされます。
なお、ネット上の一部の記事ではログアウト時のリダイレクトパスを指定する事が可能としている記事もありますが、元々の処理でトップへリダイレクトする処理がハードコードされていますので、リダイレクト先を変更するには処理そのものを書き換える以外にはありません。
もっとも単純な方法は、既存のトレイトのレスポンスを書き換えてしまう方法です。
まずはトレイトの「logout」メソッドに別名を設定します。
次に「logout」メソッドをオーバーライドして、内部でまずはオリジナルの「logout」メソッドである「traitLogout」を呼び出し通常のログアウト処理を実行します。
オリジナルの「logout」メソッドである「traitLogout」では処理の最後にルートへのリダイレクトレスポンスを返すのですが、これを使わず、「/user」へのリダイレクトをレスポンスとして返します。
これでログアウト後に利用者向けサービスのトップである「/user」へリダイレクトされるようになります。
さて、このログアウト処理ですがこのままですと正常に動作しません。
理由としては「LoginController.php」内でミドルウェアとして「guest」が指定されています。
その為、認証したままの状態で同コントローラー内のメソッドを呼び出すと、認証済みという事でホーム画面へリダイレクトされてしまいます。
ログアウト処理の呼び出しは基本的にはログイン状態で行われますので「logout」メソッドを除外する用設定します。
具体的には、「LoginController.php」の41行目の「$this->middleware(‘guest’);」を以下のように編集します。
以上でログインおよびログアウトの処理の実装が完了しました。
次回はパスワード初期化処理の実装を行います。