以下の続き。
前回、認証機能のうち、会員登録、ログイン機能をつくった。
・会員登録機能:済
・ログイン機能:済
・ログインしたユーザーは自分のフォルダのタスクだけを閲覧できる機能
入門Laravelチュートリアル (9) ToDoアプリの認証機能を作る パート2
ここでは、残りの3つ目を実装していく。
・ヘッダーの出し分け
layout.blade.php
<header>
<nav class="my-navbar">
<a class="my-navbar-brand" href="/">ToDo App</a>
<div class="my-navbar-control">
@if(Auth::check())
<span class="my-navbar-item">ようこそ, {{ Auth::user()->name }}さん</span>
|
<a href="#" id="logout" class="my-navbar-item">ログアウト</a>
<form id="logout-form" action="{{ route('logout') }}" method="POST" style="display: none;">
@csrf
</form>
@else
<a class="my-navbar-item" href="{{ route('login') }}">ログイン</a>
|
<a class="my-navbar-item" href="{{ route('register') }}">会員登録</a>
@endif
</div>
</nav>
</header>
・ログインしているかどうかはAuth::check()で確認できる、ログインしていれば、Trueが返ってくる。
・ログインユーザーはAuth::user() で取得できる。返却値はログインユーザーの情報が入った User モデルのインスタンス。
続いてログアウト。
ログアウト機能として必要なのは route('logout') の URL に POST リクエストを送信することだけ。
今回はたまたまリンクの見た目でフォームを送信したかったので JavaScript を使用している。ログアウトリンクのクリックイベントで、リンクの下に置いたフォームを送信。
<a href="#" id="logout" class="my-navbar-item">ログアウト</a>
<form id="logout-form" action="{{ route('logout') }}" method="POST" style="display: none;">
■ページ認証
続いてアプリケーションの利用にログイン認証を求める機能を実装する。
→ログインしないとフォルダやタスクの作成・閲覧ページにアクセスできないようにする。
ページに認証を求める処理はミドルウェアを用いて実現する。認証を求めるミドルウェアはデフォルトで用意されていますので、routes/web.php でルートにミドルウェアを適用。
<?php
Route::group(['middleware' => 'auth'], function() {
Route::get('/', 'HomeController@index')->name('home');
Route::get('/folders/{id}/tasks', 'TaskController@index')->name('tasks.index');
Route::get('/folders/create', 'FolderController@showCreateForm')->name('folders.create');
Route::post('/folders/create', 'FolderController@create');
Route::get('/folders/{id}/tasks/create', 'TaskController@showCreateForm')->name('tasks.create');
Route::post('/folders/{id}/tasks/create', 'TaskController@create');
Route::get('/folders/{id}/tasks/{task_id}/edit', 'TaskController@showEditForm')->name('tasks.edit');
Route::post('/folders/{id}/tasks/{task_id}/edit', 'TaskController@edit');
});
Auth::routes();
このミドルウェアはアクセスしたユーザーの認証状態をチェックして、ログインしていたらそのままコントローラーメソッド(または次のミドルウェア)に処理を渡す。ログインしていなければログイン画面にリダイレクト。
■自分のフォルダとして保存
自分のフォルダやタスクだけ参照できるようにするためには、保存時に自分のフォルダとして保存する必要がある。
フォルダコントローラーのcreateメソッドで、Auth::user()を用いて、自分のフォルダとして保存する。
Auth::user()->folders()->save($folder);
■自分のフォルダとして表示
タスクコントローラーのindexメソッド(一覧画面表示)で、フォルダ取得時の処理を以下のように修正。
$folders = Auth::user()->folders()->get();
■メールの接続設定
テスト用のメール送信サービス Mailtrap を使う。
.env に SMTP の接続情報を記載。
・Mailable クラスを作成
php artisan make:mail CommentPosted
メールの内容を変更するには、resources/views/mail/password-reset.blade.php を記載する。
<a href="{{ route('password.reset', ['token' => $token]) }}">
パスワード再設定リンク
</a>
上では、リンクのみ送信される。
■送信処理
Userモデルに以下の定義を記載。
/**
* ★ パスワード再設定メールを送信する
*/
public function sendPasswordResetNotification($token)
{
Mail::to($this)->send(new ResetPassword($token));
}
ResetPasswordは以下のコマンドで作成。中には、__constructとbuildメソッドが定義されているのでそこに追記する。
php artisan make:mail ResetPassword
以上で(9)は終了。