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..
Yorum Yap