Merhabalar, iyi günler dilerim.
Aşağıda migration ve model kodlarımı paylaştım. Şöyle bir yapı kurmak istiyorum.
User -> Role -> Menu -> Permission
Yapı da şu şekilde olacak eğer kullanıcı users sayfasını ziyaret ediyorsa menüde users route ile tanımlı olan o sayfaya kendi rolünün erişim izni varsa girecek yoksa giremeyecek.
Yapmaya çalıştığım şey de şu;
aşağıdaki çıktıya ek olarak roles altında menülerin tamamı gelmesi lazım. Sadece menu arrayi altında permission true or false bakıp ona göre işlem yapmak istiyorum.
Gelebildiğim nokta bu. Yardımlarınızı rica ederim.
{
id: 1,
first_name: "John",
last_name: "Doe",
title: "Developer",
avatar: "avatar.jpg",
phone: "1234567890",
email: "john@example.com",
two_factor_secret: null,
two_factor_recovery_codes: null,
two_factor_confirmed_at: null,
created_at: "2023-09-25T11:40:14.000000Z",
updated_at: "2023-09-25T11:40:14.000000Z",
roles: [
{
id: 1,
name: "admin",
created_by: 1,
created_at: null,
updated_at: null
}
]
}
User Model
public function roles()
{
return $this->belongsToMany(Role::class, 'role_user');
}
Schema::create('users', function (Blueprint $table) {
$table->id();
$table->string('first_name');
$table->string('last_name');
$table->string('title');
$table->string('avatar')->nullable()->default('default-pp.png');
$table->string('phone');
$table->string('email')->unique();
$table->string('password');
$table->rememberToken();
$table->timestamps();
});
Schema::table('users', function (Blueprint $table) {
$table->text('two_factor_secret')
->after('password')
->nullable();
$table->text('two_factor_recovery_codes')
->after('two_factor_secret')
->nullable();
if (Fortify::confirmsTwoFactorAuthentication()) {
$table->timestamp('two_factor_confirmed_at')
->after('two_factor_recovery_codes')
->nullable();
}
});
Schema::create('menus', function (Blueprint $table) {
$table->id();
$table->enum('type', ['title', 'menu']); // Menü öğesinin türü (örn. 'title' veya 'menu')
$table->string('icon')->nullable(); // Menü öğesinin ikonu (örn. 'fa-users' gibi)
$table->string('title'); // Menü öğesinin başlığı
$table->string('route')->nullable(); // Menü öğesinin yönlendirme yolu (örn. 'dashboard' gibi)
$table->unsignedBigInteger('parent_id')->nullable(); // Eğer alt menü ise üst menü öğesinin ID'si
$table->unsignedInteger('seq')->default(0); // Menünün sırasını belirlemek için sıra numarası
$table->timestamps();
$table->foreign('parent_id')->references('id')->on('menus')->onDelete('cascade');
});
Schema::create('roles', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->unsignedBigInteger('created_by')->nullable();
$table->foreign('created_by')->references('id')->on('users')->onDelete('set null');
$table->timestamps();
});
Schema::create('permissions', function (Blueprint $table) {
$table->unsignedBigInteger('menu_id');
$table->unsignedBigInteger('role_id');
$table->foreign('menu_id')->references('id')->on('menus')->onDelete('cascade');
$table->foreign('role_id')->references('id')->on('roles')->onDelete('cascade');
$table->timestamps();
});
Schema::create('role_user', function (Blueprint $table) {
$table->unsignedBigInteger('user_id');
$table->unsignedBigInteger('role_id');
$table->primary(['user_id', 'role_id']);
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
$table->foreign('role_id')->references('id')->on('roles')->onDelete('cascade');
});