
Laravelでlaravel/uiやlaravel/breezeを使用せずに、Bootstrapベースでguardを実装する具体的な手順
Laravelで`laravel/ui`や`laravel/breeze`を使用せずに、Bootstrapベースで`guard`を実装する具体的な手順を以下に示します。
### 1. Laravelプロジェクトのセットアップ
まず、Laravelプロジェクトを作成します。
“`bash
composer create-project –prefer-dist laravel/laravel l12_bs5_guard
cd l12_bs5_guard
“`
### 2. データベース設定
`.env`ファイルを編集して、データベース接続情報を設定します。
“`dotenv
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=l12_bs5_guard
DB_USERNAME=dbuser
DB_PASSWORD=dbpassword
“`
### wsl ubuntu mariadb に接続して db 作成
ターミナル: Mint(WSL) をクリックしてWsl起動
“` Mint(WSL)
shimimane@LEGION:/mnt/e/_l12/l12_bs_guard_001$ mysql -u dbuser -p
“`
### 3. マイグレーションの作成
`users`と`admins`テーブルのマイグレーションを作成します。
“`bash
php artisan make:migration create_admins_table
“`
`database/migrations/xxxx_xx_xx_create_admins_table.php`ファイルを編集して、`admins`テーブルのスキーマを定義します。
“`php
public function up()
{
Schema::create(‘admins’, function (Blueprint $table) {
$table->id();
$table->string(‘name’);
$table->string(‘email’)->unique();
$table->timestamp(‘email_verified_at’)->nullable();
$table->string(‘password’);
$table->rememberToken();
$table->timestamps();
});
}
public function down()
{
Schema::dropIfExists(‘admins’);
}
“`
マイグレーションを実行します。
“`bash
php artisan migrate
“`
### 4. モデルの作成
`Admin`モデルを作成します。
“`bash
php artisan make:model Admin
“`
### 5. Guardの設定
`config/auth.php`ファイルを編集して、`guards`と`providers`を設定します。
“`php
‘guards’ => [
‘web’ => [
‘driver’ => ‘session’,
‘provider’ => ‘users’,
],
‘admin’ => [
‘driver’ => ‘session’,
‘provider’ => ‘admins’,
],
],
‘providers’ => [
‘users’ => [
‘driver’ => ‘eloquent’,
‘model’ => App\Models\User::class,
],
‘admins’ => [
‘driver’ => ‘eloquent’,
‘model’ => App\Models\Admin::class,
],
],
“`
### 6. 認証コントローラーの作成
`Admin`用の認証コントローラーを作成します。
“`bash
php artisan make:controller AdminAuthController
“`
`AdminAuthController`に認証ロジックを追加します。
“`php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class AdminAuthController extends Controller
{
public function showLoginForm()
{
return view(‘auth.admin-login’);
}
public function login(Request $request)
{
$credentials = $request->only(‘email’, ‘password’);
if (Auth::guard(‘admin’)->attempt($credentials)) {
return redirect()->intended(‘/admin/dashboard’);
}
return back()->withErrors([
‘email’ => ‘The provided credentials do not match our records.’,
]);
}
public function logout()
{
Auth::guard(‘admin’)->logout();
return redirect(‘/admin/login’);
}
}
“`
### 7. ルートの設定
`routes/web.php`にルートを追加します。
“`php
use App\Http\Controllers\AdminAuthController;
Route::get(‘admin/login’, [AdminAuthController::class, ‘showLoginForm’])->name(‘admin.login’);
Route::post(‘admin/login’, [AdminAuthController::class, ‘login’]);
Route::post(‘admin/logout’, [AdminAuthController::class, ‘logout’])->name(‘admin.logout’);
“`
### 8. ビューの作成
`resources/views/auth/admin-login.blade.php`ファイルを作成し、ログインフォームを追加します。
“`html
<!DOCTYPE html>
<html lang=”ja”>
<head>
<meta charset=”UTF-8″>
<meta name=”viewport” content=”width=device-width, initial-scale=1.0″>
<title>Admin Login</title>
<link href=”https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css” rel=”stylesheet”>
</head>
<body>
<div class=”container”>
<div class=”row justify-content-center”>
<div class=”col-md-8″>
<div class=”card mt-5″>
<div class=”card-header”>{{ __(‘Admin Login’) }}</div>
<div class=”card-body”>
<form method=”POST” action=”{{ route(‘admin.login’) }}”>
@csrf
<div class=”form-group row”>
<label for=”email” class=”col-md-4 col-form-label text-md-right”>{{ __(‘E-Mail Address’) }}</label>
<div class=”col-md-6″>
<input id=”email” type=”email” class=”form-control @error(‘email’) is-invalid @enderror” name=”email” value=”{{ old(‘email’) }}” required autocomplete=”email” autofocus>
@error(‘email’)
<span class=”invalid-feedback” role=”alert”>
<strong>{{ $message }}</strong>
</span>
@enderror
</div>
</div>
<div class=”form-group row”>
<label for=”password” class=”col-md-4 col-form-label text-md-right”>{{ __(‘Password’) }}</label>
<div class=”col-md-6″>
<input id=”password” type=”password” class=”form-control @error(‘password’) is-invalid @enderror” name=”password” required autocomplete=”current-password”>
@error(‘password’)
<span class=”invalid-feedback” role=”alert”>
<strong>{{ $message }}</strong>
</span>
@enderror
</div>
</div>
<div class=”form-group row mb-0″>
<div class=”col-md-8 offset-md-4″>
<button type=”submit” class=”btn btn-primary”>
{{ __(‘Login’) }}
</button>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
</body>
</html>
“`
### 9. ダッシュボードの作成
`resources/views/admin/dashboard.blade.php`ファイルを作成し、ダッシュボードを追加します。
“`html
<!DOCTYPE html>
<html lang=”ja”>
<head>
<meta charset=”UTF-8″>
<meta name=”viewport” content=”width=device-width, initial-scale=1.0″>
<title>Admin Dashboard</title>
<link href=”https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css” rel=”stylesheet”>
</head>
<body>
<div class=”container”>
<div class=”row justify-content-center”>
<div class=”col-md-8″>
<div class=”card mt-5″>
<div class=”card-header”>{{ __(‘Admin Dashboard’) }}</div>
<div class=”card-body”>
<p>Welcome, Admin!</p>
<form method=”POST” action=”{{ route(‘admin.logout’) }}”>
@csrf
<button type=”submit” class=”btn btn-danger”>Logout</button>
</form>
</div>
</div>
</div>
</div>
</div>
</body>
</html>
“`
### 10. ダッシュボードルートの設定
`routes/web.php`にダッシュボードルートを追加します。
“`php
Route::get(‘admin/dashboard’, function () {
return view(‘admin.dashboard’);
})->middleware(‘auth:admin’);
“`
これで、`laravel/ui`や`laravel/breeze`を使用せずに、Bootstrapベースで`guard`を実装することができます。
2 種類のライセンスで類似のコードが見つかりました
================================================================================
user
================================================================================
shimimane: users migrate に laravel/gate で使用する role(int) default(0) フィールドを追加
GitHub Copilot: `users`テーブルに`role`フィールドを追加するには、新しいマイグレーションを作成してフィールドを追加します。以下の手順を実行してください。
### 1. マイグレーションの作成
以下のコマンドを実行して、新しいマイグレーションを作成します。
“`bash
php artisan make:migration add_role_to_users_table –table=users
“`
### 2. マイグレーションファイルの編集
生成されたマイグレーションファイルを開き、`role`フィールドを追加します。
“`php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class AddRoleToUsersTable extends Migration
{
public function up()
{
Schema::table(‘users’, function (Blueprint $table) {
$table->integer(‘role’)->default(0)->after(‘password’); // roleフィールドを追加
});
}
public function down()
{
Schema::table(‘users’, function (Blueprint $table) {
$table->dropColumn(‘role’); // roleフィールドを削除
});
}
}
“`
### 3. マイグレーションの実行
以下のコマンドを実行して、マイグレーションを適用します。
“`bash
php artisan migrate
“`
これで、`users`テーブルに`role`フィールドが追加され、デフォルト値が`0`に設定されます。
shimimane: users login registaer logout の機能実装
viewsも admin に準じて作成
GitHub Copilot: `users`のログイン、登録、ログアウト機能を実装し、`admin`に準じた構成で`views`を作成する手順を以下に示します。
—
### 1. 認証コントローラーの作成
`User`用の認証コントローラーを作成します。
“`bash
php artisan make:controller UserAuthController
“`
`UserAuthController`に以下のコードを追加します。
“`php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class UserAuthController extends Controller
{
public function showLoginForm()
{
return view(‘auth.user-login’);
}
public function login(Request $request)
{
$credentials = $request->only(‘email’, ‘password’);
if (Auth::guard(‘web’)->attempt($credentials)) {
return redirect()->intended(‘/user/dashboard’);
}
return back()->withErrors([
‘email’ => ‘The provided credentials do not match our records.’,
]);
}
public function showRegisterForm()
{
return view(‘auth.user-register’);
}
public function register(Request $request)
{
$request->validate([
‘name’ => ‘required|string|max:255’,
‘email’ => ‘required|string|email|max:255|unique:users’,
‘password’ => ‘required|string|min:8|confirmed’,
]);
\App\Models\User::create([
‘name’ => $request->name,
‘email’ => $request->email,
‘password’ => bcrypt($request->password),
]);
return redirect()->route(‘user.login’);
}
public function logout()
{
Auth::guard(‘web’)->logout();
return redirect(‘/user/login’);
}
}
“`
—
### 2. ルートの設定
web.phpに以下のルートを追加します。
“`php
use App\Http\Controllers\UserAuthController;
Route::get(‘user/login’, [UserAuthController::class, ‘showLoginForm’])->name(‘user.login’);
Route::post(‘user/login’, [UserAuthController::class, ‘login’]);
Route::get(‘user/register’, [UserAuthController::class, ‘showRegisterForm’])->name(‘user.register’);
Route::post(‘user/register’, [UserAuthController::class, ‘register’]);
Route::post(‘user/logout’, [UserAuthController::class, ‘logout’])->name(‘user.logout’);
Route::get(‘user/dashboard’, function () {
return view(‘user.dashboard’);
})->middleware(‘auth:web’);
“`
—
### 3. ビューの作成
#### ログインフォーム (`resources/views/auth/user-login.blade.php`)
“`html
<!DOCTYPE html>
<html lang=”ja”>
<head>
<meta charset=”UTF-8″>
<meta name=”viewport” content=”width=device-width, initial-scale=1.0″>
<title>User Login</title>
<link href=”https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css” rel=”stylesheet”>
</head>
<body>
<div class=”container”>
<div class=”row justify-content-center”>
<div class=”col-md-8″>
<div class=”card mt-5″>
<div class=”card-header”>{{ __(‘User Login’) }}</div>
<div class=”card-body”>
<form method=”POST” action=”{{ route(‘user.login’) }}”>
@csrf
<div class=”form-group row”>
<label for=”email” class=”col-md-4 col-form-label text-md-right”>{{ __(‘E-Mail Address’) }}</label>
<div class=”col-md-6″>
<input id=”email” type=”email” class=”form-control @error(‘email’) is-invalid @enderror” name=”email” value=”{{ old(‘email’) }}” required autocomplete=”email” autofocus>
@error(‘email’)
<span class=”invalid-feedback” role=”alert”>
<strong>{{ $message }}</strong>
</span>
@enderror
</div>
</div>
<div class=”form-group row”>
<label for=”password” class=”col-md-4 col-form-label text-md-right”>{{ __(‘Password’) }}</label>
<div class=”col-md-6″>
<input id=”password” type=”password” class=”form-control @error(‘password’) is-invalid @enderror” name=”password” required autocomplete=”current-password”>
@error(‘password’)
<span class=”invalid-feedback” role=”alert”>
<strong>{{ $message }}</strong>
</span>
@enderror
</div>
</div>
<div class=”form-group row mb-0″>
<div class=”col-md-8 offset-md-4″>
<button type=”submit” class=”btn btn-primary”>
{{ __(‘Login’) }}
</button>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
</body>
</html>
“`
#### 登録フォーム (`resources/views/auth/user-register.blade.php`)
“`html
<!DOCTYPE html>
<html lang=”ja”>
<head>
<meta charset=”UTF-8″>
<meta name=”viewport” content=”width=device-width, initial-scale=1.0″>
<title>User Register</title>
<link href=”https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css” rel=”stylesheet”>
</head>
<body>
<div class=”container”>
<div class=”row justify-content-center”>
<div class=”col-md-8″>
<div class=”card mt-5″>
<div class=”card-header”>{{ __(‘User Register’) }}</div>
<div class=”card-body”>
<form method=”POST” action=”{{ route(‘user.register’) }}”>
@csrf
<div class=”form-group row”>
<label for=”name” class=”col-md-4 col-form-label text-md-right”>{{ __(‘Name’) }}</label>
<div class=”col-md-6″>
<input id=”name” type=”text” class=”form-control @error(‘name’) is-invalid @enderror” name=”name” value=”{{ old(‘name’) }}” required autocomplete=”name” autofocus>
@error(‘name’)
<span class=”invalid-feedback” role=”alert”>
<strong>{{ $message }}</strong>
</span>
@enderror
</div>
</div>
<div class=”form-group row”>
<label for=”email” class=”col-md-4 col-form-label text-md-right”>{{ __(‘E-Mail Address’) }}</label>
<div class=”col-md-6″>
<input id=”email” type=”email” class=”form-control @error(‘email’) is-invalid @enderror” name=”email” value=”{{ old(‘email’) }}” required autocomplete=”email”>
@error(‘email’)
<span class=”invalid-feedback” role=”alert”>
<strong>{{ $message }}</strong>
</span>
@enderror
</div>
</div>
<div class=”form-group row”>
<label for=”password” class=”col-md-4 col-form-label text-md-right”>{{ __(‘Password’) }}</label>
<div class=”col-md-6″>
<input id=”password” type=”password” class=”form-control @error(‘password’) is-invalid @enderror” name=”password” required autocomplete=”new-password”>
@error(‘password’)
<span class=”invalid-feedback” role=”alert”>
<strong>{{ $message }}</strong>
</span>
@enderror
</div>
</div>
<div class=”form-group row”>
<label for=”password-confirm” class=”col-md-4 col-form-label text-md-right”>{{ __(‘Confirm Password’) }}</label>
<div class=”col-md-6″>
<input id=”password-confirm” type=”password” class=”form-control” name=”password_confirmation” required autocomplete=”new-password”>
</div>
</div>
<div class=”form-group row mb-0″>
<div class=”col-md-8 offset-md-4″>
<button type=”submit” class=”btn btn-primary”>
{{ __(‘Register’) }}
</button>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
</body>
</html>
“`
#### ダッシュボード (`resources/views/user/dashboard.blade.php`)
“`html
<!DOCTYPE html>
<html lang=”ja”>
<head>
<meta charset=”UTF-8″>
<meta name=”viewport” content=”width=device-width, initial-scale=1.0″>
<title>User Dashboard</title>
<link href=”https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css” rel=”stylesheet”>
</head>
<body>
<div class=”container”>
<div class=”row justify-content-center”>
<div class=”col-md-8″>
<div class=”card mt-5″>
<div class=”card-header”>{{ __(‘User Dashboard’) }}</div>
<div class=”card-body”>
<p>Welcome, User!</p>
<form method=”POST” action=”{{ route(‘user.logout’) }}”>
@csrf
<button type=”submit” class=”btn btn-danger”>Logout</button>
</form>
</div>
</div>
</div>
</div>
</div>
</body>
</html>
“`
—
これで、`users`のログイン、登録、ログアウト機能が実装され、`admin`に準じたビューも作成されました。
2 種類のライセンスで類似のコードが見つかりました
===========================================================================
laravel/gate
===========================================================================
shimimane: users migrate に laravel/gate で使用する role(int) default(0) フィールドを追加
GitHub Copilot: `users`テーブルに`role`フィールドを追加するには、新しいマイグレーションを作成してフィールドを追加します。以下の手順を実行してください。
### 1. マイグレーションの作成
以下のコマンドを実行して、新しいマイグレーションを作成します。
“`bash
php artisan make:migration add_role_to_users_table –table=users
“`
### 2. マイグレーションファイルの編集
生成されたマイグレーションファイルを開き、`role`フィールドを追加します。
“`php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class AddRoleToUsersTable extends Migration
{
public function up()
{
Schema::table(‘users’, function (Blueprint $table) {
$table->integer(‘role’)->default(0)->after(‘password’); // roleフィールドを追加
});
}
public function down()
{
Schema::table(‘users’, function (Blueprint $table) {
$table->dropColumn(‘role’); // roleフィールドを削除
});
}
}
“`
### 3. マイグレーションの実行
以下のコマンドを実行して、マイグレーションを適用します。
“`bash
php artisan migrate
“`
これで、`users`テーブルに`role`フィールドが追加され、デフォルト値が`0`に設定されます。
shimimane: users login registaer logout の機能実装
viewsも admin に準じて作成
GitHub Copilot: `users`のログイン、登録、ログアウト機能を実装し、`admin`に準じた構成で`views`を作成する手順を以下に示します。
—
### 1. 認証コントローラーの作成
`User`用の認証コントローラーを作成します。
“`bash
php artisan make:controller UserAuthController
“`
`UserAuthController`に以下のコードを追加します。
“`php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class UserAuthController extends Controller
{
public function showLoginForm()
{
return view(‘auth.user-login’);
}
public function login(Request $request)
{
$credentials = $request->only(‘email’, ‘password’);
if (Auth::guard(‘web’)->attempt($credentials)) {
return redirect()->intended(‘/user/dashboard’);
}
return back()->withErrors([
‘email’ => ‘The provided credentials do not match our records.’,
]);
}
public function showRegisterForm()
{
return view(‘auth.user-register’);
}
public function register(Request $request)
{
$request->validate([
‘name’ => ‘required|string|max:255’,
‘email’ => ‘required|string|email|max:255|unique:users’,
‘password’ => ‘required|string|min:8|confirmed’,
]);
\App\Models\User::create([
‘name’ => $request->name,
‘email’ => $request->email,
‘password’ => bcrypt($request->password),
]);
return redirect()->route(‘user.login’);
}
public function logout()
{
Auth::guard(‘web’)->logout();
return redirect(‘/user/login’);
}
}
“`
—
### 2. ルートの設定
web.phpに以下のルートを追加します。
“`php
use App\Http\Controllers\UserAuthController;
Route::get(‘user/login’, [UserAuthController::class, ‘showLoginForm’])->name(‘user.login’);
Route::post(‘user/login’, [UserAuthController::class, ‘login’]);
Route::get(‘user/register’, [UserAuthController::class, ‘showRegisterForm’])->name(‘user.register’);
Route::post(‘user/register’, [UserAuthController::class, ‘register’]);
Route::post(‘user/logout’, [UserAuthController::class, ‘logout’])->name(‘user.logout’);
Route::get(‘user/dashboard’, function () {
return view(‘user.dashboard’);
})->middleware(‘auth:web’);
“`
—
### 3. ビューの作成
#### ログインフォーム (`resources/views/auth/user-login.blade.php`)
“`html
<!DOCTYPE html>
<html lang=”ja”>
<head>
<meta charset=”UTF-8″>
<meta name=”viewport” content=”width=device-width, initial-scale=1.0″>
<title>User Login</title>
<link href=”https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css” rel=”stylesheet”>
</head>
<body>
<div class=”container”>
<div class=”row justify-content-center”>
<div class=”col-md-8″>
<div class=”card mt-5″>
<div class=”card-header”>{{ __(‘User Login’) }}</div>
<div class=”card-body”>
<form method=”POST” action=”{{ route(‘user.login’) }}”>
@csrf
<div class=”form-group row”>
<label for=”email” class=”col-md-4 col-form-label text-md-right”>{{ __(‘E-Mail Address’) }}</label>
<div class=”col-md-6″>
<input id=”email” type=”email” class=”form-control @error(‘email’) is-invalid @enderror” name=”email” value=”{{ old(‘email’) }}” required autocomplete=”email” autofocus>
@error(‘email’)
<span class=”invalid-feedback” role=”alert”>
<strong>{{ $message }}</strong>
</span>
@enderror
</div>
</div>
<div class=”form-group row”>
<label for=”password” class=”col-md-4 col-form-label text-md-right”>{{ __(‘Password’) }}</label>
<div class=”col-md-6″>
<input id=”password” type=”password” class=”form-control @error(‘password’) is-invalid @enderror” name=”password” required autocomplete=”current-password”>
@error(‘password’)
<span class=”invalid-feedback” role=”alert”>
<strong>{{ $message }}</strong>
</span>
@enderror
</div>
</div>
<div class=”form-group row mb-0″>
<div class=”col-md-8 offset-md-4″>
<button type=”submit” class=”btn btn-primary”>
{{ __(‘Login’) }}
</button>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
</body>
</html>
“`
#### 登録フォーム (`resources/views/auth/user-register.blade.php`)
“`html
<!DOCTYPE html>
<html lang=”ja”>
<head>
<meta charset=”UTF-8″>
<meta name=”viewport” content=”width=device-width, initial-scale=1.0″>
<title>User Register</title>
<link href=”https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css” rel=”stylesheet”>
</head>
<body>
<div class=”container”>
<div class=”row justify-content-center”>
<div class=”col-md-8″>
<div class=”card mt-5″>
<div class=”card-header”>{{ __(‘User Register’) }}</div>
<div class=”card-body”>
<form method=”POST” action=”{{ route(‘user.register’) }}”>
@csrf
<div class=”form-group row”>
<label for=”name” class=”col-md-4 col-form-label text-md-right”>{{ __(‘Name’) }}</label>
<div class=”col-md-6″>
<input id=”name” type=”text” class=”form-control @error(‘name’) is-invalid @enderror” name=”name” value=”{{ old(‘name’) }}” required autocomplete=”name” autofocus>
@error(‘name’)
<span class=”invalid-feedback” role=”alert”>
<strong>{{ $message }}</strong>
</span>
@enderror
</div>
</div>
<div class=”form-group row”>
<label for=”email” class=”col-md-4 col-form-label text-md-right”>{{ __(‘E-Mail Address’) }}</label>
<div class=”col-md-6″>
<input id=”email” type=”email” class=”form-control @error(‘email’) is-invalid @enderror” name=”email” value=”{{ old(‘email’) }}” required autocomplete=”email”>
@error(‘email’)
<span class=”invalid-feedback” role=”alert”>
<strong>{{ $message }}</strong>
</span>
@enderror
</div>
</div>
<div class=”form-group row”>
<label for=”password” class=”col-md-4 col-form-label text-md-right”>{{ __(‘Password’) }}</label>
<div class=”col-md-6″>
<input id=”password” type=”password” class=”form-control @error(‘password’) is-invalid @enderror” name=”password” required autocomplete=”new-password”>
@error(‘password’)
<span class=”invalid-feedback” role=”alert”>
<strong>{{ $message }}</strong>
</span>
@enderror
</div>
</div>
<div class=”form-group row”>
<label for=”password-confirm” class=”col-md-4 col-form-label text-md-right”>{{ __(‘Confirm Password’) }}</label>
<div class=”col-md-6″>
<input id=”password-confirm” type=”password” class=”form-control” name=”password_confirmation” required autocomplete=”new-password”>
</div>
</div>
<div class=”form-group row mb-0″>
<div class=”col-md-8 offset-md-4″>
<button type=”submit” class=”btn btn-primary”>
{{ __(‘Register’) }}
</button>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
</body>
</html>
“`
#### ダッシュボード (`resources/views/user/dashboard.blade.php`)
“`html
<!DOCTYPE html>
<html lang=”ja”>
<head>
<meta charset=”UTF-8″>
<meta name=”viewport” content=”width=device-width, initial-scale=1.0″>
<title>User Dashboard</title>
<link href=”https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css” rel=”stylesheet”>
</head>
<body>
<div class=”container”>
<div class=”row justify-content-center”>
<div class=”col-md-8″>
<div class=”card mt-5″>
<div class=”card-header”>{{ __(‘User Dashboard’) }}</div>
<div class=”card-body”>
<p>Welcome, User!</p>
<form method=”POST” action=”{{ route(‘user.logout’) }}”>
@csrf
<button type=”submit” class=”btn btn-danger”>Logout</button>
</form>
</div>
</div>
</div>
</div>
</div>
</body>
</html>
“`
—
これで、`users`のログイン、登録、ログアウト機能が実装され、`admin`に準じたビューも作成されました。
2 種類のライセンスで類似のコードが見つかりました
shimimane: users role (int) を使用して laravel/gate 機能を実装する
role
0:guest
1:user
2:admin
3:owner
9:system
GitHub Copilot: `role`フィールドを使用して、Laravelの`Gate`機能を実装する手順を以下に示します。
—
### 1. `Gate`の定義
`App\Providers\AuthServiceProvider`の`boot`メソッドで`Gate`を定義します。
“`php
use Illuminate\Support\Facades\Gate;
public function boot()
{
$this->registerPolicies();
Gate::define(‘is-guest’, function ($user) {
return $user->role === 0;
});
Gate::define(‘is-user’, function ($user) {
return $user->role === 1;
});
Gate::define(‘is-admin’, function ($user) {
return $user->role === 2;
});
Gate::define(‘is-owner’, function ($user) {
return $user->role === 3;
});
Gate::define(‘is-system’, function ($user) {
return $user->role === 9;
});
}
“`
—
### 2. コントローラーでの使用
`Gate`を使用してアクセス制御を行います。
“`php
use Illuminate\Support\Facades\Gate;
public function someAction()
{
if (Gate::allows(‘is-admin’)) {
// 管理者向けの処理
return view(‘admin.dashboard’);
}
if (Gate::allows(‘is-user’)) {
// 一般ユーザー向けの処理
return view(‘user.dashboard’);
}
abort(403, ‘Unauthorized action.’);
}
“`
—
### 3. Bladeでの使用
Bladeテンプレートで`@can`ディレクティブを使用してアクセス制御を行います。
“`html
@can(‘is-admin’)
<p>管理者専用のコンテンツ</p>
@endcan
@can(‘is-user’)
<p>一般ユーザー専用のコンテンツ</p>
@endcan
@cannot(‘is-admin’)
<p>管理者以外のコンテンツ</p>
@endcannot
“`
—
### 4. ミドルウェアでの使用
特定のルートに対して`Gate`を適用する場合、カスタムミドルウェアを作成します。
“`bash
php artisan make:middleware RoleMiddleware
“`
作成された`RoleMiddleware`を編集します。
“`php
use Closure;
use Illuminate\Support\Facades\Gate;
class RoleMiddleware
{
public function handle($request, Closure $next, $role)
{
if (!Gate::allows($role)) {
abort(403, ‘Unauthorized action.’);
}
return $next($request);
}
}
“`
`Kernel.php`にミドルウェアを登録します。
“`php
protected $routeMiddleware = [
// …
‘role’ => \App\Http\Middleware\RoleMiddleware::class,
];
“`
ルートでミドルウェアを使用します。
“`php
Route::get(‘/admin/dashboard’, function () {
return view(‘admin.dashboard’);
})->middleware(‘role:is-admin’);
“`
—
### 5. テストデータの準備
`users`テーブルの`role`フィールドに適切な値を設定します。
“`php
DB::table(‘users’)->insert([
‘name’ => ‘Admin User’,
‘email’ => ‘admin@example.com’,
‘password’ => bcrypt(‘password’),
‘role’ => 2, // 管理者
]);
“`
—
これで、`role`フィールドを使用した`Gate`機能の実装が完了しました。`role`に応じてアクセス制御を柔軟に行うことができます。

