Cara Membuat Role User di Laravel Tanpa Menggunakan Package dan Menampilkan Menu di Blade Sesuai Role User
Berikut adalah panduan langkah demi langkah untuk membuat role user di Laravel tanpa memanfaatkan package eksternal:
Langkah 1: Buat Tabel roles dan user_roles
1.1 Membuat Tabel roles
Buat tabel roles untuk menyimpan daftar role yang tersedia:
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateRolesTable extends Migration
{
public function up()
{
Schema::create('roles', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('description')->nullable();
$table->timestamps();
});
}
public function down()
{
Schema::dropIfExists('roles');
}
}
1.2 Membuat Tabel user_roles
Buat tabel user_roles untuk menyimpan relasi antara pengguna dan role:
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateUserRolesTable extends Migration
{
public function up()
{
Schema::create('user_roles', function (Blueprint $table) {
$table->id();
$table->unsignedBigInteger('user_id');
$table->unsignedBigInteger('role_id');
$table->timestamps();
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
$table->foreign('role_id')->references('id')->on('roles')->onDelete('cascade');
});
}
public function down()
{
Schema::dropIfExists('user_roles');
}
}
Langkah 2: Buat Model Role dan UserRole
2.1 Membuat Model Role
Model ini digunakan untuk mengelola data role:
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Role extends Model
{
protected $fillable = ['name', 'description'];
public function users()
{
return $this->belongsToMany(User::class, 'user_roles');
}
}
2.2 Membuat Model UserRole
Model ini bertugas mengelola relasi antara user dan role:
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class UserRole extends Model
{
protected $table = 'user_roles';
protected $fillable = ['user_id', 'role_id'];
public function user()
{
return $this->belongsTo(User::class);
}
public function role()
{
return $this->belongsTo(Role::class);
}
}
Langkah 3: Tambahkan Relasi Role ke Model User
Tambahkan relasi role ke model User untuk menyambungkan dengan roles. Berikut implementasinya:
namespace App\Models;
use Illuminate\Foundation\Auth\User as Authenticatable;
class User extends Authenticatable
{
// ...
public function roles()
{
return $this->belongsToMany(Role::class, 'user_roles');
}
public function hasRole($role)
{
return $this->roles()->where('name', $role)->exists();
}
}
Langkah 4: Buat Middleware untuk Memeriksa Role
Buat middleware bernama CheckRole untuk memverifikasi apakah pengguna memiliki role tertentu atau tidak:
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
class CheckRole
{
public function handle(Request $request, Closure $next, $role)
{
if (!$request->user()->hasRole($role)) {
abort(403, 'Unauthorized action.');
}
return $next($request);
}
}
Catatan:
Jangan lupa mendaftarkan middleware ini di file Kernel.php pada bagian $routeMiddleware:
protected $routeMiddleware = [
// ...
'role' => \App\Http\Middleware\CheckRole::class,
];
Langkah 5: Tampilkan Menu di Blade Sesuai Role
Anda dapat menampilkan menu yang spesifik untuk setiap role pada template Blade. Berikut contohnya dalam file layouts/app.blade.php:
<nav>
<ul>
@if(auth()->user()->hasRole('admin'))
<li><a href="{{ route('admin.dashboard') }}">Dashboard</a></li>
@endif
@if(auth()->user()->hasRole('user'))
<li><a href="{{ route('user.profile') }}">Profile</a></li>
@endif
</ul>
</nav>
Kesimpulan
Dengan mengikuti langkah-langkah di atas, Anda berhasil:
- Membuat tabel untuk role dan relasi pengguna dengan role.
- Membuat model untuk mengelola data role dan relasi.
- Menambahkan relasi ke dalam model
User. - Membuat middleware untuk membatasi akses berdasarkan role.
- Menampilkan menu yang berbeda di Blade sesuai role pengguna.
Teknik ini memungkinkan Anda untuk mengelola role pengguna tanpa menggunakan package tambahan. 🎉
