Laravel
WordPress

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`に応じてアクセス制御を柔軟に行うことができます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です