LaravelでTodoリストを実装してみよう!~実装編6:ログイン機能の実装~
はじめに
今回は、ログイン機能の実装をしていきます!
laravel breezeの導入
まず、ログイン機能の実装するために、breeze
というライブラリを導入します。
breeze
とは、laravelにログイン機能を追加するためのライブラリです。
laravel breezeのインストール
breeze
のインストールには、以下のコマンドを実行します!
sail composer require laravel/breeze --dev
sail artisan breeze:install
Which Breeze stack would you like to install? → Blade with Alpine
Would you like dark mode support? → No
Which testing framework do you prefer? → PHPUnit
breezejpのインストール
breezejp
はbreeze
を日本語化してくれるライブラリです。
以下のコマンドを実行してインストールします。
sail composer require askdkc/breezejp --dev
sail artisan breezejp
動作確認
http://localhost/
にアクセスして、画面右上に「Login」「Register」ボタンが追加されていれば、成功です。
「Register」ボタンを押すと以下の画面が表示され、アカウントを新規登録できます。
これで、breeze
の導入は完了です!
ログインしないと操作できないようにする
ライブラリの導入が完了したので、ログインしないとTodoアプリの操作ができないようにします。
web.phpの修正
routes/web.php
のTodoアプリに関するルーティングを以下のように修正します。
Route::middleware('auth')->group(function (){
Route::get('todolist', \App\Http\Controllers\TodolistController::class)
->name('todolist');
Route::get('addtodo-page',\App\Http\Controllers\Todolist\AddTodo\AddTodoPageController::class)
->name('addtodo-page');
Route::post('todo/addtodo',\App\Http\Controllers\Todolist\AddTodo\AddTodoController::class)
->name('addtodo');
Route::get('edittodo-page/{todoId}', \App\Http\Controllers\Todolist\EditTodo\EditTodoPageController::class)
->name('edittodo-page')->where('todoId', '[0-9]+');
Route::put('todo/edittodo/{todoId}', \App\Http\Controllers\Todolist\EditTodo\EditTodoController::class)
->name('edittodo')->where('todoId', '[0-9]+');
Route::delete('todo/delete/{todoId}', \App\Http\Controllers\Todolist\DeleteTodo\DeleteTodoController::class)
->name('deletetodo')->where('todoId', '[0-9]+');
Route::put('todo/checktodo/{todoId}', \App\Http\Controllers\Todolist\CheckTodoController::class)
->name('checktodo')->where('todoId', '[0-9]+');
Route::get('restoretodo-page', App\Http\Controllers\Todolist\RestoreTodo\RestoreTodoPageController::class)
->name('restoretodo-page');
Route::put('todo/restoretodo/{todoId}', \App\Http\Controllers\Todolist\RestoreTodo\RestoreTodoController::class)
->name('restoretodo')->where('todoId', '[0-9]+');
});
前回までで作成したルーティングの記述を以下のミドルウェアでグループ化することで、囲われたルーティングのURLにアクセスする場合、ログインを求めるようになります。
Route::middleware('auth')->group(function (){
// ログイン処理したいルーティング //
});
ログインしたアカウントのTodoのみを表示する
ここまでで、Todoアプリの操作にログインを要求できるようになりました。
前回までは、すべてのTodoが表示されてました。
ログインしたアカウントのTodoのみを表示できるようにします。
TodolistController.phpの修正
ログインしたアカウントの名前とTodoのみをDBから取得し、フロントエンドにデータとして渡すために、以下のような修正を加えます。
public function __invoke(Request $request)
{
+ $user_id = Auth::id();
+ $user_name = Auth::user()->name;
- $todolists = Todolist::where([['status', '=', 0]])->get();
+ $todolists = Todolist::where([['user_id', '=', $user_id], ['status', '=', 0]])->get();
- return view('todolist.todolist')->with(['todolists' => $todolists]);
+ return view('todo.todolist')->with(['user_name' => $user_name, 'todolists' => $todolists]);
}
動作確認
http://localhost/todolist
にアクセスして、下の画像のように、ログインしたユーザー名が表示され、ユーザーのTodoが表示されていれば成功です。
- 「Test User」でログインした場合
なお、新規作成したログインすると、画像のようにTodoが表示されていません。
- 「ケンベル」でログインした場合
ログアウトボタンの実装
Todoアプリにログアウトボタンを実装します。
todolist-single.blade.phpの編集
ヘッダーの部分にログアウトボタンを実装します。
<header class="flex fixed top-0 bg-green-500 w-full items-center">
<h1>
<a href={{ route('todolist') }} class="flex items-center">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" class="w-10 h-10">
<path d="M11.7 2.805a.75.75 0 0 1 .6 0A60.65 60.65 0 0 1 22.83 8.72a.75.75 0 0 1-.231 1.337 49.948 49.948 0 0 0-9.902 3.912l-.003.002c-.114.06-.227.119-.34.18a.75.75 0 0 1-.707 0A50.88 50.88 0 0 0 7.5 12.173v-.224c0-.131.067-.248.172-.311a54.615 54.615 0 0 1 4.653-2.52.75.75 0 0 0-.65-1.352 56.123 56.123 0 0 0-4.78 2.589 1.858 1.858 0 0 0-.859 1.228 49.803 49.803 0 0 0-4.634-1.527.75.75 0 0 1-.231-1.337A60.653 60.653 0 0 1 11.7 2.805Z" />
<path d="M13.06 15.473a48.45 48.45 0 0 1 7.666-3.282c.134 1.414.22 2.843.255 4.284a.75.75 0 0 1-.46.711 47.87 47.87 0 0 0-8.105 4.342.75.75 0 0 1-.832 0 47.87 47.87 0 0 0-8.104-4.342.75.75 0 0 1-.461-.71c.035-1.442.121-2.87.255-4.286.921.304 1.83.634 2.726.99v1.27a1.5 1.5 0 0 0-.14 2.508c-.09.38-.222.753-.397 1.11.452.213.901.434 1.346.66a6.727 6.727 0 0 0 .551-1.607 1.5 1.5 0 0 0 .14-2.67v-.645a48.549 48.549 0 0 1 3.44 1.667 2.25 2.25 0 0 0 2.12 0Z" />
<path d="M4.462 19.462c.42-.419.753-.89 1-1.395.453.214.902.435 1.347.662a6.742 6.742 0 0 1-1.286 1.794.75.75 0 0 1-1.06-1.06Z" />
</svg>
<p class="text-2xl">Todoアプリ</p>
</a>
</h1>
+ <nav class="flex-auto">
+ <ul class="flex mr-3 text-xl uppercase list-none justify-end">
+ <li class="ml-3 hover:text-gray-600">
+ <form method="POST" action="{{ route('logout') }}">
+ @csrf
+ <button onclick="event.preventDefault(); this.closest('form').submit();">
+ ログアウト
+ </button>
+ </form>
+ </li>
+ </ul>
+ </nav>
</header>
localhostのアクセス先をtodolistにする
毎回http://localhost/todolist
を直接入力するのは大変なので、
http://localhost
アクセスしたときに、自動的にhttp://localhost/todolist
にアクセスするようにします。
- Route::get('/', function () {
- return view('welcome');
- });
+ Route::redirect('/', 'todolist');
動作確認
http://localhost
にアクセスして、Todoリストの一覧ページの右上にログアウトボタンが表示されているか確認します。
ログアウトボタンを押すとログイン画面に遷移することができれば成功です。
Todoの追加機能にアカウントIDを追加
これまでは、Todoの追加をする際に、アカウントのIDがなくても追加できるようになっていました。
今回は、アカウントごとにTodoを管理していきたいので、Todoの追加・編集の際にアカウントIDを付与できるようにコントローラーを編集します。
AddTodoRquest.phpの修正
新規登録するTodoにアカウントのIDを付与するために、リクエストにuserId()
メソッドを追加します。
////省略////
public function userId() : int {
return $this->user()->id;
}
AddTodoController.phpの修正
Todo追加機能のコントローラーであるAddTodoController.php
を以下のように書き換えます。
public function __invoke(AddTodoRquest $request)
{
$todo = new Todolist();
+ $todo->user_id = $request->userId();
$todo->content = $request->content();
$todo->deadline = $request->deadline();
$todo->save();
return redirect()->route('todolist');
}
これで、問題なくTodoを追加することができるはずです!
おわりに
今回は、ログイン機能の実装をしました!
次回は、アカウント情報の閲覧と退会機能を実装しようと思います!
ではでは!
Discussion