Laravel開発、混在状態となっているログインページを一本化させる
本情報登録及び所有書籍登録ページは完成したので、ユーザーに関する情報について細かな設定を実施していきます。
まずは、既に作成済みの新規登録・ログイン周りの見直しです。
今回の目的
新規登録・ログインを行う設定がコマンドによる自動生成・カスタム作成の2種類が混在している状態なので1つに統一し、不要な情報を削除する。
なぜやるか
重複した内容がある為、どれが必要でどれが不要かが分かりにくい。
必要でない情報は書くべきではないので削除することで、必要な情報のみを残す。
やりたいこと
混在しているログイン設定を1本化したい
ルーティング設定をスリム化したい
不要な情報を削除したい
やったこと
ログインページ作成状況を確認した
コンフィグ設定をみなおした
ファイルの混在状況を解消した
実施内容
ログインページの作成経緯
とりあえずログイン機能をとにかくつけた
本ブログにて過去にログイン周りについて触れてきましたので、まず振り返ります。
まずは、とにかくログインできるようにしました。
Laravelではコマンドによってログイン用ページが簡単に作成できる機能がありました。
ルート、コントローラー、ビューまで一気にできます、これを利用すればとりあえずログインは可能ということで一時的にこれを使用することにしました。
自動生成フォームから変更
しかし、ビューは自動生成されたものに限られる為、ページのカスタムをしました。
この時は、最初に使用したコマンドで作成されたルート・コントローラー・ビューは使用していません、カスタムビュー用にすべて設定しています。
このため、2通りのログイン処理ができており、ルーティング設定はカスタムルートを設定しているものの、どちらも動作する状態です。
カスタムページを作る時点で一つのルートのみにするのが一番良いとは思いましたが、まずはカスタムすることを完遂するために参考した作成方法通りに作成。ここで修正するのに悩んでいてもすぐに出来そうもなかったので、一本化は後回しとして、他のページを先行して作成していました。
ログインフォームを見直す
しかし、必要な物はひとつでいいので、ここで不要な物を消すことにしました。
どちらを残すか検討しましたが、コマンドで自動生成したファイルを残す形として、自分で作成したHTML表示を移し替えることにしました。
※簡単に言うと、カスタムしたビューの中身を自動生成ファイル内にコピーさせます。
自動生成のファイルはAuthフォルダにまとまっており、ルーティングも記述一行でわかりやすいためです。
載せ替えの手順としては、ビューファイル→コントローラー→ルーティングの順で実施していきます。
載せ替えが完了した時点で、カスタムログインページとして作成したファイルは順次消去していきます。
コンフィグ設定を変更する
Auth機能について再確認
ここで改めてログイン機能の仕組み、ミドルウェアの仕組みを確認することにしました。
以下のサイトを参考にさせて頂きました、ありがとうございます。
認証機能カスタマイズ
カスタムログインの処理
ミドルウェア設定
ルーティング設定を修正
設定方法を改めて確認するなかで、ミドルウェアの記述手順がありましたので、併せて修正することにしました。
現状のルーティング設定はこちらです。
# /routes/web.php
ミドルウェア設定を個別に設定していたのですが、グループ化することでまとめられることが分かりましたので、変更しました。
# /routes/web.php
Route::group指定でログイン必須ページをまとめて記述しました。これでだいぶすっきりしてます。
カスタムログインページ用のルーティングについても、これから行うAuthコントローラ利用のログインとすればAuth::routes()のみとなり、さらに整理できそうです。
23行目付近のルート情報はwelcomeが不要なので消します、index自体は必要なので残します。
新規登録時の設定を修正
改めて新規登録時の一連の動作も確認します。
Auth::routes()による新規登録画面です。
# http://127.0.0.1:8000/register
登録完了後はビュー画面が次の画面に遷移します。
登録完了の画面です。このページは~/homeとなります。今回新規登録・ログイン後はリダイレクトしてbookページに遷移させます、このページは使用しません。
リダイレクト設定を設定後~/homeページを削除していきます。
リダイレクト処理設定
しているコードを確認します。
# ~/app/Http/Controllers/Auth/RegisterController
31行目で/homeが設定されています。これを修正。
# ~/app/Http/Controllers/Auth/RegisterController
bookページにリダイレクトする設定とし、home画面は不要となりました。
home画面を削除して、関連するルーティング情報も削除しました。
この時点であわせてwelcomeページも併せて削除しました。
ルーティング設定はこのようになります。
# /routes/web.php
後はカスタムログインページをAuthルーティング内に設置してやればルーティングもスッキリして余計なファイルはなくなりそうです。
ビューファイルを移設する
ログインページを移設する
まずはカスタムログインページの内容をAuth自動生成ビューファイルへ載せ替えます。
ログインページには専用のレイアウトファイルがありますので、同じくカスタムしていたレイアウトファイルも併せて載せ替えることにしました。
載せ替え…といってもカスタム作成したビューファイルの中身をAuth機能生成のビューファイルの中身にコピー。それだけです。
# ログインページ
載せ替えたことで、Auth::Routes();で指定するルートでカスタムしていたレイアウト表示が使えるようになりました。
ルート設定を調整
ところで、自動生成ビューファイルのフォームで設定されていたform内のactionがカスタムしていたファイルで設定していた内容と異なることに気がつきました。
カスタムページのフォームではaction="/user/login"とルート指定していました。
自動生成ログインページのフォームではaction="{{ route('login') }}"となっています。
ルート名を指定して書いていたので、これを引き続き使おうと考えました。
まず、ルート情報を確認します。
$ php artisan route:list
これが、現在設定されているルート情報一覧です。
この中のName列の名前を指定してルート情報を設定しています。
これで設定すればディレクトリ構成を気にすることもなく、名前指定によって分かりやすくなるので、ルート設定箇所については順次変更することとしました。
ルーティング調整時にエラー発見
ここでルーティング情報を変更しつつ、あっちこっち画面を移動していて気がついたのですが、ログイン済みのままトップページにURL入力で直接アクセスし、ログインボタンを押すと、ログイン用のフォームは表示されずに、ログイン後のコンテンツにアクセスできます。
まぁ、ログインは完了しているので当然と言われればそうなのですが。
しかし、トップページからログインボタンを押すとnot foundのエラーが表示されるようになりました。
きっちりログアウトしているとエラー画面はでずにきちんと処理されてはいます。
この内容について調べていたところ、こちらを参考にさせて頂きました、ありがとうございます。
初めてのLaravel 5.6 : (30) Middlewarelaravel10.wordpress.com
確認したところ、ミドルウェアでログイン済み時のリダイレクト先が設定されているようです。
# ~/appHttp/Middleware/RedirectIfAuthenticated.php
ここが/homeとなっていた為、ログイン済み時にこの処理が走ると、/homeにリダイレクトされていたため、not foundとなっていたようです。homeを消す前はページがあった為、結果としてログイン後の画面が表示されていたようです。
※たしかにhomeを消す前はbookページからブラウザの戻るを押すとhome画面がでていたのですが、こういうことか…。
リダイレクト先を修正して、この問題は解消しました。
新規登録をページ移設する
ここまででログインページの設定変更が完了したので、新規登録ページものせかえます。
手順は先程と同様となるため、詳しい内容は割愛させて頂きます。
ここは、特に問題なく移設完了です。
不要データを消す
ルーティング削除
これが完了すれば、あとは不要なデータを消していきます。
まずは、ルーティングの削除
# /routes/web.php
ログイン周りがすっきりしました。
アクション削除
コントローラー不要アクションも削除します。
# ~/app/Http/Controllers/UserController.php
destoryより下にあった、新規登録・ログインの設定を全て削除。
Authコントローラーの記述を使用することでuserコントローラーで設定していたログイン周りのアクションが削除できました。
Authビューに載せ替えが終了しているので、カスタム作成したuserフォルダ内のビューファイルも全て削除します。
以上で、ログインまわりの設定見直しが完了しました。
初めからこの状態で実装できるのがベストだとは思いますが、いろんな実装方法を学習することができました。
そしてなにより、タイムアウト時にカスタムログインページではなく、Authデフォルトのログインページが表示されていた為、両方のログインページを使用している…といった問題が解決できたのでよかったとおもいます。