Laravel Breeze で作成した、ログイン、ユーザー登録、パスワードのリセット、メールの検証、パスワードの確認機能に、ユーザー削除機能を追加します。
親記事
Dockerで環境構築して Laravel 9で CRUD 機能を作る
2022年03月15日
Laravel環境
- macOS
- Laravel v9.0.2
- Docker 20.10.12
関連記事
Laravel Breeze でシンプルな認証機能を追加する方法
2023年01月10日
Laravelポリシーを作る
削除しようとしているユーザーと現在のユーザーが一致しているかの判断をポリシーでしていきます。
ポリシーは、特定のモデルに関する認可処理を行うクラスです。今回はUserモデルに関するポリシーなので、UserPolicyを作成します。
php artisan make:policy UserPolicy
//sail
sail artisan make:policy UserPolicy
app/Policies ディレクトリにUserPolicy.php ファイルが作成されます。
ポリシーの登録
app/Providers/AuthServiceProvider.php ファイルでポリシーを登録します。
protected $policies = [
User::class => UserPolicy::class,
];
削除するユーザーと現在のユーザーが一致しているかの判断を UserPolicy クラスで作成します。
<?php
namespace App\Policies;
use App\Models\User;
use Illuminate\Auth\Access\HandlesAuthorization;
class UserPolicy
{
use HandlesAuthorization;
public function edit(User $user, User $user_model) {
return $user->id == $user_model->id;
}
}
現在のユーザーと、消すユーザーのidを比較します。
作成できたので、後ほどユーザーを削除する前に実行します。
ユーザー削除機能を追加する
ユーザー情報の一覧を表示するプロフィールページを作成して、そこにユーザー削除ボタンを設置して行きます。
ルートと見た目を変更
use App\Http\Controllers\UserController;
Route::get('/user/profile', [UserController::class, 'show'])
->middleware('auth')
->name('user.profile');
Route::delete('/user/{user}', [UserController::class, 'destroy'])
->name('user.destroy');
1: これから作る UserController をインポートしときます。UserController のshow メソッドでプロフィールの表示、destroy メソッドでユーザーの削除を行います。
4: プロフィールページへは認証済みのユーザーのみが入ることができます。
profile.blade.php ファイルを作成
プロフィールページを作成します。
<x-app-layout>
<x-slot name="header">
<h2 class="font-semibold text-xl text-gray-800 leading-tight">
{{ __('Profile') }}
</h2>
</x-slot>
<div class="py-12">
<div class="max-w-7xl mx-auto sm:px-6 lg:px-8">
<div class="bg-white overflow-hidden shadow-sm sm:rounded-lg">
<div class="p-6 bg-white border-b border-gray-200">
{{__('Profile')}}
</div>
</div>
</div>
<div x-data="{toggle : false}" class="max-w-7xl mx-auto sm:px-6 lg:px-8 mt-10">
<div class="bg-white overflow-hidden shadow-sm sm:rounded-lg">
<div class="p-6 bg-white border-b border-gray-200 flex justify-between items-center">
<p class="">アカウントを削除</p>
<button x-show="!toggle" @click="toggle = ! toggle" class="p-2 bg-blue-400 rounded text-white"
>確認</button>
<div
x-show="toggle"
@click.away="toggle = false"
class="flex items-center mx-3 justify-between"
x-transition:enter="transition transform ease-out duration-300"
x-transition:enter-start="-translate-x-10 opacity-0"
x-transition:enter-end="translate-x-0"
>
<form method="post" action="{{ route('user.destroy', $user->id) }}">
@csrf
@method('DELETE')
<button type="submit" class="py-2 px-3 bg-red-400 rounded-lg text-white">削除</button>
</form>
<button @click="toggle = false" class="p-2 mx-3 rounded-sm shadow-sm bg-yellow-100">キャンセル</button>
<p class="text-red-300 ">本当にいいですか?</p>
</div>
</div>
</div>
</div>
</div>
</x-app-layout>
navigation.blade.php ファイルに追加する
ナビゲーションバーにプロフィールページへのリンクを追加します。
<!-- 省略 -->
<!-- Navigation Links -->
<div class="hidden space-x-8 sm:-my-px sm:ml-10 sm:flex">
@auth
<x-nav-link :href="route('dashboard')" :active="request()->routeIs('dashboard')">
{{ __('Dashboard') }}
</x-nav-link>
<x-nav-link :href="route('user.profile')" :active="request()->routeIs('user.profile')">
{{ __('Profile') }}
</x-nav-link>
@endauth
<!-- 省略 -->
<!-- Responsive Navigation Menu -->
<div :class="{'block': open, 'hidden': ! open}" class="hidden sm:hidden">
<div class="pt-2 pb-3 space-y-1">
@auth
<x-responsive-nav-link :href="route('dashboard')" :active="request()->routeIs('dashboard')">
{{ __('Dashboard') }}
</x-responsive-nav-link>
<x-responsive-nav-link :href="route('user.profile')" :active="request()->routeIs('user.profile')">
{{ __('Profile') }}
</x-responsive-nav-link>
@endauth
</div>
<!-- 省略 -->
コントローラー
UserController 内でプロフィールページの表示と、ユーザーの削除を行います。
php artisan make:controller UserController
//sail
sail artisan make:controller UserController
app/Http/Controllers/UserController.php ファイルが作成されます。
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\User;
class UserController extends Controller
{
public function show()
{
$user = auth()->user();
return view('profile', ['user' => $user]);
}
public function destroy(User $user)
{
$this->authorize('edit', $user);
$user->delete();
return redirect()->route('top');
}
}
プロフィールを表示
6: ユーザーモデルインポート
13: 現在認証済みのユーザー情報を取得
14: ユーザー情報をもたせて、profile ビューを返します。
ユーザーの削除
19: コントローラー内でポリシーを使うには、authorize メソッドを使います。
メソッド名と、User インスタンスを引数に呼び出します。
問題があれば403ステータスコードのHTTPレスポンスに変換され、なければ先へ進みます。
20-21: ユーザーを削除して、トップページへリダイレクトされます。
以上Laravelの認証機能にユーザー削除機能を追加する方法でした。