Spatie adalah salah satu solusi paling mujarab ketika ingin membuat Role Management maupun Permission Management di laravel. Sebenarnya saya sudah lama ingin menggunakannya, namun belum ada projek yang membutuhkan Role Management dalam sistemnya. Baru belakangan, saya menemukan Project yang memerlukan Spatie. Belajarlah saya menggunakannya.

Dalam instalasi spatie di laravel 10, sangat mudah sebenarnya. Tinggal install package-nya pakai Composer.

composer require spatie/laravel-permission
PHP

Setelah package ditambahkan menggunakan Composer. Kamu tinggal menghapus tembolok yang sudah dibuat laravel. Kata dokumentasinya sih gini, “Clear your config cache. This package requires access to the permission config. Generally it’s bad practice to do config-caching in a development environment

 php artisan optimize:clear
 # or
 php artisan config:clear
PHP

Setelahnya, tinggal dilakukan migrasi. Dalam migrasi ini, akan di create beberapa table di basis data agar dapat berjalan.

 php artisan migrate
PHP

Tambahin trait yang dibutuhkan ke model Users. Kalau pakai VSCode, sepertinya ketika masukin ‘use HasRoles’ trait Spatie\Permission\Traits\HasRoles trait langsung ditambahkan di bagian atas kode.

// The User model requires this trait
use HasRoles;
PHP

nanti jadinya dalam model Users menjadi seperti ini:

use Illuminate\Foundation\Auth\User as Authenticatable;
use Spatie\Permission\Traits\HasRoles;

class User extends Authenticatable
{
    use HasRoles;

    // ...
}
PHP

Kalau mau nambahin Role baru ataupun Permission baru, kamu bisa tambahin pakai kode dibawah. Nanti akan menambahkan data baru di table Role ataupun Permission, tergantung kamu nambahinnya apa.

use Spatie\Permission\Models\Role;
use Spatie\Permission\Models\Permission;

$role = Role::create(['name' => 'writer']);
$permission = Permission::create(['name' => 'edit articles']);
PHP

Kamu juga bisa menambahkan permission ke Role yang sudah ada. Tinggal jalanin pakai kode sederhana kaya gini. Bisa pilih salah satu.

$role->givePermissionTo($permission);
#or
$permission->assignRole($role);
PHP

Mau Assign Role atau Permission ke User, tinggal cari user-nya, lalu assign deh. Kamu bisa juga ngasih Assign Role lebih dari satu untuk satu user, tinggal pakai Array atau Larik, atau bisa juga langsung dipisah pake koma ( , ) saja.

$user->assignRole('writer');

// You can also assign multiple roles at once
$user->assignRole('writer', 'admin');
// or as an array
$user->assignRole(['writer', 'admin']);
PHP

Mau ngapus Role? Tinggal di-remove aja role-nya.

$user->removeRole('writer');
PHP

Atau mau mengubah semua role sebelumnya pakai role yang baru? Gaperlu hapus satu-satu role-nya, tinggal syncRoles aja.

// All current roles will be removed from the user and replaced by the array given
$user->syncRoles(['writer', 'admin']);
PHP

Kalau sudah diatur hak akses tiap user-nya, tinggal atur halaman mana saja yang bisa dan tidak bisa diakses oleh user berdasarkan role-nya. Kalau saya, milih yang paling gampang, atur di Route.

Route::group(['middleware' => ['role:super-admin']], function () {
    //
});

Route::group(['middleware' => ['permission:publish articles']], function () {
    //
});

Route::group(['middleware' => ['role:super-admin','permission:publish articles']], function () {
    //
});

Route::group(['middleware' => ['role_or_permission:publish articles']], function () {
    //
});
PHP

Kalau mau banyak Permission ataupun banyak Roles, kamu bisa pakai pipes ( | ). Pipes ini bekerja seperti kondisional ‘OR’

Route::group(['middleware' => ['role:super-admin|writer']], function () {
    //
});

Route::group(['middleware' => ['permission:publish articles|edit articles']], function () {
    //
});

Route::group(['middleware' => ['role_or_permission:super-admin|edit articles']], function () {
    //
});
PHP

Kalau udah, tinggal atur di berkas blade nya pakai @role dan @endrole

@role('writer')
    I am a writer!
@else
    I am not a writer...
@endrole
PHP