ログインチェックの利用
スキャフォールディングを利用することで、認証部分はコーディングなしで実現できました。では、認証後の各リクエスト処理に、認証済みかどうかをチェックする機能を追加するにはどうすればいいのでしょうか。実は、これも専用のミドルウェアを利用すれば簡単にできます。以下、コードを交えて具体的に紹介していきましょう。
コントローラクラスの用意
まず、コントローラクラスを用意しましょう。これは、リスト2の内容です。
<?php namespace App\Http\Controllers; use App\Http\Controllers\Controller; class Chap10Controller extends Controller { public function helloWithAuth() { return view("chap10.helloWithAuth"); } }
単に画面を遷移させたいだけですので、処理内容としては特筆すべきものはありません。
継承機能を利用したテンプレート
ここで記述したhelloWithAuth()メソッドを実行させるURLを次のものとします。
http://localhost/firstlaravel/public/chap10/helloWithAuth
このリンクをホーム画面に追加します。そのホーム画面のテンプレートファイルはresources/views/home.blade.phpです。このファイルを開いてみると、HTMLファイルとして先頭にあるはずのDOCTYPE宣言がなく、次のコードから始まっています。
@extends('layouts.app')
これは、Bladeの継承機能を利用したものです。
画面を作成する場合、ヘッダー部分やナビゲーション部分、フッター部分などは各画面共通です。そのようなものを全てのテンプレートファイルに記述するのは非効率的です。そこで、共通部分を記述したテンプレートファイルを作成しておき、差分だけを各ファイルに記述する方法をとります。
今回のスキャフォールディングで、この共通部分にあたるレイアウトテンプレートとして、resources/views/layouts/app.blade.phpが追加されています。このファイルを見ると、リスト3の部分が記述されています。
〜省略〜 </nav> <main class="py-4"> @yield('content') // (1) </main> </div> </body> </html>
この(1)の部分に差分として埋め込みたいテンプレートがある場合は、次のようなコードを記述します。
@extends("layouts.app") @section("content") : @endsection
こう記述することで、この@section("content")と@endsectionに囲まれた部分を、リスト3の(1)に埋め込んだ画面が表示されます。ホーム画面のテンプレートファイルhome.blade.phpはこの仕組みを利用しています。
では、このファイルにリンクを追記しましょう。これは、リスト4の(1)の部分です。
@extends('layouts.app') @section('content') <div class="container"> <div class="row justify-content-center"> 〜省略〜 </div> <a href="/firstlaravel/public/chap10/helloWithAuth">第10回サンプルへ</a> // (1) </div> @endsection
追記が完了し、ホーム画面をリロードすると図6のように無事リンクが追加されています。
helloWithAuthで表示させるテンプレートの作成
次に、helloWithAuthリクエストで利用するテンプレートファイルを作成しましょう。せっかくなので、前項で紹介したレイアウトテンプレートを利用して作成します。これはリスト5の内容です。
@extends("layouts.app") @section("content") <section> <p>無事認証を通過しました!</p> <ul> <li>{{Auth::user()->name}}</li> // (1) <li>{{Auth::user()->email}}</li> // (1) </ul> </section> @endsection
helloWithAuthリクエストが実行されてこの画面が表示されるタイミングは必ずログイン後とし、認証済みかどうかのチェックを行うようにします。その方法は後述します。
ここで紹介したいのは、(1)の部分です。認証済みの場合、認証されたユーザー情報をいつでも取り出せるようにLaravelが用意してくれています。それが、(1)の「Auth::user()」というメソッドです。このメソッドに続けて、取り出したいプロパティ(テーブルのカラムに対応)を指定するだけで、その内容を表示できます。(1)では、名前とメールアドレスを表示するようにしています。
認証チェックミドルウェア
コントローラクラスとテンプレートができたので、helloWithAuthリクエストをルーティング登録しましょう。実は、このときにミドルウェアとして認証チェックを指定するだけで、そのリクエスト処理がログイン後のみに有効かどうかを自動的にチェックしてくれます。それはリスト6のコードです。
〜省略〜 Route::get("/chap10/helloWithAuth", "Chap10Controller@helloWithAuth")->middleware("auth");
ミドルウェアとして指定するのは、「auth」だけです。これだけで、そのリクエスト処理がログイン後、つまり認証済みのユーザーだけに許されたことを意味し、認証済みかどうかを自動チェックしてくれます。未認証の場合は、自動的にログイン画面に遷移します。
リスト6の1行を追記した上で、動作確認しておきましょう。
図6のリンクが追加されたホーム画面のリンクをクリックし、helloWithAuthリクエスト処理を実行してみましょう。図7の画面が表示されます。
ログインユーザーの名前とメールアドレスが表示されていることも確認できます。これが、リスト5の(1)の部分です。
さらに、[Laravel]リンクや[Logout]リンクなど、レイアウトテンプレート部分が無事表示されているのが確認できるでしょう。
この[Logout]リンクをクリックしてください。図1の未ログイン状態のホーム画面が表示されます。この未ログイン状態のまま、ブラウザの戻るボタンやURLの直接入力などの方法で、helloWithAuthリクエスト処理を実行させてください。すぐに、図2のログイン画面へ遷移します。未ログイン状態では、helloWithAuthリクエスト処理が実行できないことがわかります。
ここでリスト6の末尾の「->middleware("auth")」を削除したルーティング登録をしたとき、すなわち、helloWithAuthリクエスト処理が未ログイン状態でも実行できるようにした場合、helloWithAuthリクエスト処理を実行させると図8のエラー画面が表示されます。
エラー内容から、テンプレートファイル上の「Auth::user()->name」が適切に処理できていないことを意味します。これは、逆にいえば、helloWithAuthリクエスト処理は実行されたことを意味します。
このことから、ルーティング登録に「->middleware("auth")」を記述するだけで、ログイン状態のチェックからログイン画面への遷移まで自動で行ってくれることがわかると思います。
まとめ
以上で、本連載は全て終了です。これまで全10回にわたりお付き合いいただき、ありがとうございました。この10回分の連載でLaravelの主要な機能は一通り紹介できたと思います。ただ、あくまで主要な機能をさらっと紹介したに過ぎず、Laravel自体はフルスタックフレームワークという呼び名の通り、細かい機能まで含めると、本当にさまざまなものが用意されています。そのような、この連載中で紹介しきれなかった機能を今後利用するにあたり、一番信用できる情報は、なんといっても公式ドキュメントです。このドキュメントを読んでいくにあたって、その基礎となるような力をこの連載で養っていただけたなら、これほど嬉しいことはありません。