0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Last updated at Posted at 2022-03-28

以下の続き。

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

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?