Laravel ile Gate Yapısı Örneği

Merhaba, laravel ile gate örneği yapalım da şurada dursun. Sonra dönüp bakarız.

Diyelim ki her kullanıcıya ait rolleriniz var.

Bizim kurgumuz many-to-many relationship 'tir.

Önce migration larımızı yazalım.

create_roles_table.php  dosyamız şu şekilde olsun.

Schema::create('roles', function (Blueprint $table) {
   $table->id();
   $table->string('name');
   $table->string('roles_slug');
   $table->integer('parent_id');
   $table->timestamps();
});

 

Ardından create_users_table.php dosyamızı şu şekilde yapalım.

Schema::create('users', function (Blueprint $table) {
    $table->id();
    $table->string('name');
    $table->string('surname');
    $table->string('email')->unique();
    $table->string('password');
    $table->timestamps();
});

Many-to-many relationship bir yapı kuruyorsak ayrı bir tabloya ihtiyacımız var.  Bu tablo da  role_user olsun.

Schema::create('role_user', function (Blueprint $table) {
   $table->id();
   $table->unsignedBigInteger('role_id');
   $table->unsignedBigInteger('user_id');
   $table->timestamps();
});

 

Artık modellerimizin içine yazmaya başlayalım. İlişkileri tanımlayarak başlayalım.

User modeli:

public function roles()
{
  return $this->belongsToMany('App\Models\Role');
}

Roles modeli:

public function users()
{
  return $this->belongsToMany('App\Models\User');
}

Gate işlemine gelmeden önce, User modeline şu fonksiyonu ekleyelim. Böylelikle Gate yazarken bu fonksiyonu kullanırız.

public function hasRole($role) {

  if ( $this->roles()->where('roles_slug', $role)->first() ) return true;

      return false;
}


Yukarıda yazdığımız fonksiyona birazdan geleceğiz.

Laravel'de Gate tanımlamak için AuthServiceProvider.php dosyası içindeki boot() fonksiyonunu kullanıyoruz.

public function boot()
{
    $this->registerPolicies();
    
    // Admin  mi ? 
    Gate::define('is-Admin', function($user) {
        return 
            $user->hasRole('admin') ? Response::allow(): Response::deny('Bu işlem için admin olmalısınız!');
    });

    // Normal Kullanıcı mı ?
    Gate::define('is-user', function($user) {
        return 
            $user->hasRole('user') ? Response::allow() : Response::deny('Bu işlem için kullanıcı olmalısınız!');
     });

    // Editör mü ?
    Gate::define('is-editor', function($user) {
        return
            $user->hasRole('editor') ? Response::allow() :  Response::deny('Bu işlem için editor olmalısınız!');
        });

    }

Birazdan geleceğiz dediğimiz yerdeyiz.

Tüm Gate'lerde  hasRole() fonksiyonuna gidiyoruz. Böyle bir role var mı diye roles tablosunda bulunan roles_slug sütunundan sorgulama yapıyoruz. Varsa true, aksi halde false dönüyor.

 

Şimdi gelelim bunları nerelerde kullanacağımıza..

Diyelim ki, her bir kullanıcaya özel Controller mevcut. 

AdminController içine:

public function __construct() {

   $this->middleware('can:is-Admin');
}

UserController içine:

public function __construct() {
      
   $this->middleware('can:is-user');
}

EditorController içine:

public function __construct() {

    $this->middleware('can:is-editor');
}

Evet, artık test etme zamanı.

Diyelim ki bir editör, login olduktan sonra şöyle bir url'e gidiyor. http://xxx.com/editor

Biz bunu değiştirip şöyle yapıp enter'a basalım. http://xxx.com/admin

Bizi karşılayan ekran aşağıdaki gibi olacak.

Bu işlem için admin olmalısınız!

 

Evet, hepsi bu kadar..

1129 Görüntülenme

Yorum Yap