Laravel5.4での認証機能を実装します。
なお、Laravel5.4では認証機能について動作を確認したいだけであれば以下のコマンドを実行するだけで準備が完了します。
> php artisan make:auth
> php artisan migrate
前者のコマンドではルートの追加と必要となるビューの作成、そしてログイン後のホーム表示処理用のコントローラーの作成が行われます。
後者のコマンドでは認証で利用するテーブルの作成が行われます。
それ以外に必要となるもの(例えば、コントローラーなど)は最初から必要最小限のものが準備されています。
但し、今回は前者のコマンドは使いません。
理由としてはルートもビューの内容も通常はアプリケーションによる為、それ程再利用性が高くありません。
その為、今回は再活用可能なもののみ利用する事とし、それ以外は個々に実装します。
具体的には「app/Http/Controllers/Auth」配下の「ForgotPasswordController.php」「LoginController.php」「RegisterController.php」「ResetPasswordController.php」の4つのコントローラー、そして「database/migrations」配下の「2014_10_12_000000_create_users_table.php」「2014_10_12_100000_create_password_resets_table.php」の2つのマイグレーションファイルは再利用します。
それ以外については標準で準備されるリソース類を参考にしつつ、それぞれ整備します。
なお動作サンプルはコチラにありますので参考にして下さい。
また、本連載で作成または編集したファイルは(ほぼ)コチラに掲載しております。
目次
準備作業
個別の機能の実装を開始する前に、まずは準備作業を実施します。
各機能で利用するテーブルの準備、共通部分のレイアウトファイルの作成、そしてルートの定義などを行います。
テーブルの準備
Laravel5.4では最初から「2014_10_12_000000_create_users_table.php」「2014_10_12_100000_create_password_resets_table.php」が準備されており、通常の認証機能を利用するために必要な環境が整っています。
今回はこれらで定義されたテーブルを利用しますので、そのまま実行します。
> php artisan migrate
以上の操作で「users」「password_resets」の2つのテーブルが作成されます。
ルートの定義
原則「make:auth」で作成されるものに準拠しています。
但し、パスワード初期化時のメール送信、初期化完了時点の画面を個別画面としたため、若干その点を追加しています。
以下の内容を「route/web.php」に追記します。
Laravel5.2以降ではMultiAuthが標準実装されています。
その為、それらを利用する場合も考慮して最初から利用者(User)向けのリソース類は全て「User(または、user)」として分けて定義しています。
ベースレイアウトの準備
今回標準で準備されるビューを使わない為、それぞれの機能で必要となりビューを個別に作成する必要があります。
ここでは予め共通となるレイアウト部分をベースレイアウトとして定義し再活用します。
以下の内容のファイルを「resources/views」配下に「layouts」フォルダを作成し、その中に「base.blade.php」として作成します。
デザイン作業が主な目的ではないので、ここではBootstrapを活用しています。
このベースレイアウトをそれぞれのビュー生成時に活用し、個々の画面を作成します。
それほど特殊な点はありませんが、ログイン状態に応じて「利用者ログイン」または「利用者ログアウト」のリンクが切り替わります。
なお、一部CSSの定義を追加している為、「public/css」内に「base.css」を以下の内容で作成します。
Authディレクトリのリネーム
今回は予め準備されている4つのコントローラーを再利用します。
これらのファイルは「app/Http/Controllers」内の「Auth」ディレクト内に保存されています。
前述のとおりLaravel5.2以降ではMultiAuthが標準実装されており、それらを利用する場合も考慮し、利用者向けの機能は利用者向けのリソースとして管理できるよう、ディレクトリ名を「User」に変更します。
また、同ディレクトリ内の4つのファイルの「namespace」を「namespace App\Http\Controllers\User;」に全て変更します。
上記操作を完了後、「composer dump-autoload」を実行して下さい。
新規利用者登録機能の実装
新規利用者登録機能を実装します。
ここでは新規利用者登録に関するビューやコントローラーの修正を行うだけでなく、その他ログイン後のホーム画面やログイン前のトップ画面なども合わせて準備します。
新規利用者登録フォームの作成
まずは新規利用者登録フォームのビューファイルを作成します。
以下の内容のファイルを「resources/views」配下に「user」フォルダを作成し、その中に「register.blade.php」として作成します。
1行目で予め準備したレイアウトファイルを指定しています。
新規利用者登録フォームでは「アカウント名」「メールアドレス」そして「パスワード」の入力を行います。
なお、パスワードについては確認用の入力も受け付けています。
バリデーションと連携する為、確認対象とする要素名に「_confirmation」を付加したものを確認入力項目として準備します。
新規利用者登録フォームの表示
さて、この状態で「/user/register」を表示すると「View [auth.register] not found.」というエラーが発生します。
予め作成したリソースは「user.register」ですが、参照されているリソースは「auth.register」となっています。
これは標準で実装されているフォーム表示処理にて予め「auth.register」を利用する用定義されている為です。
作成したリソースを利用する場合、「app/Http/Controllers/User/RegisterController.php」にて「showRegistrationForm」を次の内容でオーバライドして変更します。
エラーメッセージの修正
新規利用者登録フォームが正常に表示されるようになったら、試しにそのフォームを何も入力しないまま登録処理を実行します。
新規利用者登録フォームの要素は全て必須入力となっていますので、それらのエラーが表示されます。
エラーの表示を見ると、例えば「アカウント名」項目であれば「nameは必ず指定してください。」のように要素名がそのまま表示されてしまいます。
Laravel5.4では標準のエラーメッセージ上に表示される要素名を任意のものに置き換える場合は以下の2つの方法で変更できます。
- 「resources/lang/ja/validation.php」内の「attributes」に要素名毎に表示名を定義する方法
- バリデーション時に「setAttributeNames」で都度要素名毎の表示名を指定する方法
管理上は前者の方法が一元的に管理できますので便利ですが、小規模な場合や、同一要素名を異なる名称で使っている場合などは後者の方法を利用します。
今回はカスタマイズ方法を確認する意味も含め後者の方法で対応してみたいと思います。
バリデーションに関する処理を変更する場合、「app/Http/Controllers/User/RegisterController.php」にて「validator」を次の内容でオーバーライドします。
バリデーションルールに特に変更はありません。
57行目〜62行目に定義されている「setAttributeNames」にてそれぞれの要素に表示名を設定しています。
これで先ほどのアカウント名が未入力であった場合のエラー表示は「アカウント名は必ず指定してください。」のように表示されます。
登録完了後のリダイレクト先の変更
標準機能の登録処理では正常に登録が完了した後、指定されたページへリダイレクトが行われます。
通常は利用者のホーム画面やトップ画面へリダイレクトさせます。
今回は利用者のホーム画面(ログイン後最初に表示される画面)へリダイレクトさせたいと思います。
リダイレクト先の変更は「$redirectTo」パラメータを操作して行います。
ホーム画面用のビューの作成
便宜上ホーム画面用のビューが必要になりますので作成します。
以下の内容のファイルを「resources/views/user」配下に「home.blade.php」として作成します。
利用者向けトップ画面用のビューの作成
ホーム画面と合わせてログイン前に表示される画面も作成しておきます。
以下の内容のファイルを「resources/views」配下に「top.blade.php」として作成します。
ホーム画面およびトップ画面表示用のコントローラーの作成
最後に先ほど作成したそれぞれのビューを表示する処理を請け負うコントローラーを作成します。
ホーム画面の表示とトップ画面(ログイン前)の表示を同じコントローラー内に実装する事に若干違和感を覚えますが、今回は便宜上この構成で進めます。
以下の内容のファイルを「app/Http/Controllers/User」配下に「HomeController.php」として作成します。
トップ画面の表示処理は16行目〜19行目、ホーム画面の表示は21行目〜24行目に実装しています。
トップ画面については認証を必要としませんので「auth」ミドルウェアの対象から除外しています。
以上の内容で新規利用登録までの実装が完了しました。
「/user/register」へアクセスし、利用登録が正常に完了すると自動的にホーム画面が表示されます。
次回はログイン処理、ログアウト処理の実装を行います。