Laravel Spatie ( Rol - Yetki ) Paketini Kişiselleştirme

Merhaba, gün olur lazım olur diye buraya bırakıyorum.

Bilindiği üzere rol ve yetki bazlı işlemlerde Laravel'de Spatie adında güzel bir kütüphane var. 

Bu kütüphaneyi kurduğunuzu ve vendor dosyasını publish ettiğinizi varsayıyorum. 

Diyelim ki permissions tablosuna yeni bir sütun eklemek istiyorsunuz. Benim örneğimde her kullanıcının department_id 'sini de tutmam gerekti. Dilerseniz buradan devam edelim. 

Proje dizinimizde migrations altında bulunan xxxx_create_permission_tables.php dosyasını açın ve 'permissions' tablosunun oluşturulduğu yere aşağıdaki değişiklikleri ekleyin. 

Schema::create($tableNames['permissions'], function (Blueprint $table) use ($tableNames, $columnNames) {

     $table->bigIncrements('id');
     $table->unsignedBigInteger('department_id');  // Biz ekledik 
     $table->string('name');
     $table->string('guard_name');
     $table->timestamps();

     /* foreign key olduğunu belirtiyoruz. */
     $table->foreign('department_id')
           ->references('id')
           ->on('departments')
           ->onDelete('cascade');

});

Ardıdan php artisan migrate komutu ile veritabanuna ekleyelim. 

Tabi işimiz burada bitmedi. Permissions tablosuna bir sütun ekledik. 

Tabiki bitmedi. 

Vendor dizinine gidiyoruz. Aşağıdaki adres sizde değişiklik gösterebilir. 

vendor/spatie/laravel-permission/config/permission.php

Bu dosyayı açalım.


return [

    'models' => [
   
       //'permission' => Spatie\Permission\Models\Permission::class, // Aslı bu
         'permission' => \App\Models\Spatie\Permission::class,       // Biz değiştirdik


       //'role' => Spatie\Permission\Models\Role::class,             // Aslı bu
         'role' => \App\Models\Spatie\Role::class,                   // Biz değiştirdik
 
    ],

Kendimize göre ayarlama yapacağımız için ve ben Models klasörü altında Spatie adında bir klasör daha açtım. 

Daha sonra, yine vendor bulunan model dosyalarını kendi model klasörümüz altındaki Spatie klasörü altına kopyalayalım.

vendor/spatie/laravel-permission/src/Models/Permission.php

vendor/spatie/laravel-permission/src/Models/Role.php

Tabi namespace leri değiştirmeyi unutmayın. Bizim senaryomuzda şöyle olacak:

namespace App\Models\Spatie;

Permission.php dosyasını açalım. ve create metoduna istediğimiz değişiklikleri ekleyelim. 

Aslı şu şekilde olacaktır. 

public static function create(array $attributes = [])
{

  $attributes['guard_name'] = $attributes['guard_name'] ?? Guard::getDefaultName(static::class);

  $permission = static::getPermissions(['name' => $attributes['name'], 'guard_name' => $attributes['guard_name']])->first();

  if ($permission) {
      throw PermissionAlreadyExists::create($attributes['name'], $attributes['guard_name']);
  }

    
  return static::query()->create($attributes);
   
}

Biz, department_id eklemiştik. O zaman ekleyelim.

 

public static function create(array $attributes = [])
{

  $attributes['guard_name'] = $attributes['guard_name'] ?? Guard::getDefaultName(static::class);

  // Buraya ekledik
  $permission = static::getPermissions(['department_id' => $attributes['department_id'], 'name' => $attributes['name'], 'guard_name' => $attributes['guard_name']])->first();

  if ($permission) {
      throw PermissionAlreadyExists::create($attributes['name'], $attributes['guard_name']);
  }

 
  return static::query()->create($attributes);
    
}

Yaptığımız değişikliği anladınız değil mi? Aslında burada bir şey yapmaya gerek yoktu. Ama ben yine de ekledim. 

Burada kontrol ediyor. Böyle bir permission var mı yok mu diye. Varsa hatayı fırlatıyor.

Siz bu kısmı kendinize göre özelleştirebilirsiniz.

 

Evet, hepsi bu kadar..

Ben kaçar..

 

 

167 Görüntülenme

Yorum Yap