【Laravel】Web開発初心者が1週間で入門チュートリアルを実施した記録(9)

以下の続き。

https://qiita.com/yotty19911207/items/19816d1ccde0acf0baa1

前回、認証機能のうち、会員登録、ログイン機能をつくった。
・会員登録機能：済
・ログイン機能：済
・ログインしたユーザーは自分のフォルダのタスクだけを閲覧できる機能

<h1>入門Laravelチュートリアル (9) ToDoアプリの認証機能を作る パート2</h1>

ここでは、残りの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 を使う。

https://mailtrap.io/

.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)は終了。