/app/Providers/AuthServiceProvider.php
<?php
namespace App\Providers;
use Illuminate\Support\Facades\Gate;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
class AuthServiceProvider extends ServiceProvider
{
public function boot(): void
{
Gate::define('admin', function($user) {
return $user->role == 'admin';
});
Gate::define('member', function($user) {
return $user->role == 'member';
});
}
}
Via Controller
use Illuminate\Support\Facades\Gate;
if (! Gate::allows('admin')) {
abort(403);
}
if (Gate::any(['admin', 'member'])) {
// admin and member can see this
}
if (Gate::none(['admin', 'member'])) {
// admin and member can't see this
}
Gate::authorize('admin');
$this->authorize('admin');
Via middleware
Route::middleware(['auth','can:admin'])->group(function () {
// admin only
});
Route::get('/admin', function () {
// admin can access this url
})->middleware('can:admin');
Via blade directive
@can('admin')
<!-- admin can see this -->
@endcan
@cannot('admin')
<!-- admin can't see this -->
@endcan
@canany(['admin', 'member'])
<!-- admin and member can see this -->
@endcanany
Add Migration
php artisan make:migration add_role_column_to_users_table
/database/migrations/xxxx_xx_xx_xxxxxx_add_role_column_to_users_table.php
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::table('users', function (Blueprint $table) {
$table->enum('role', ['admin','member'])->default('admin')->index();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::table('users', function (Blueprint $table) {
$table->dropColumn(['role']);
});
}
};