Kritik Sorun Tespiti ve Çözümü
10 Ocak 2026
Kullanıcı yönetim panelinde (Admin Panel → Kullanıcılar) bir kullanıcının rolünü değiştirdiğimizde, kaydet butonuna bastıktan sonra değişiklikler yansımıyordu. Mesela bir kullanıcıyı "Normal Kullanıcı" yapıp kaydettiğimizde hala "Admin" olarak gözüküyordu. Ya da tam tersi, admin yetkisi verdiğimizde normal kullanıcı olarak kalıyordu.
Sistemin "kullanıcı etiketleme" mekanizmasında bir uyumsuzluk vardı. Şöyle ki:
Veritabanındaki tüm "App\Models\User" etiketli kayıtlar silindi.
Artık roller "User" etiketi ile (doğru format) kaydediliyor.
Sistem artık doğru etiket ("User") ile rolleri arıyor.
Artık kullanıcı rolü değiştirme işlemi sorunsuz çalışıyor. Bir kullanıcıyı admin yapabilir, editör yapabilir veya normal kullanıcıya çevirebilirsiniz. Kaydet butonuna bastığınızda değişiklikler anında yansıyor ve doğru rol bilgisi gösteriliyor.
DB::table('model_has_roles')->where('model_type', 'App\Models\User')->delete()
→ Hiçbir kayıt silinmiyor
DB::table('model_has_roles')->where('model_type', 'User')->delete()
→ Kayıtlar siliniyor
// app/Providers/AppServiceProvider.php:114
Relation::morphMap([
'User' => \App\Models\User::class,
]);
// ❌ Sorun: Component 'App\Models\User' yazıyordu
// ✅ Çözüm: MorphMap 'User' kullanıyor
SQL Query:
SELECT * FROM roles WHERE model_type = ?
❌ Binding: ["User"] → DB'de "App\Models\User" var → 0 sonuç
✅ Düzeltme sonrası: ["User"] → DB'de "User" var → 1 sonuç
Duplicate ve yanlış model_type kayıtları temizlendi:
DELETE FROM model_has_roles WHERE model_type = 'App\Models\User';
→ 6 yanlış kayıt silindi
📁 Dosya:
Modules/UserManagement/app/Http/Livewire/UserManageComponent.php
❌ Eski Kod:
DB::table('model_has_roles')->insert([
'role_id' => $role->id,
'model_type' => User::class, // "App\Models\User"
'model_id' => $user->id
]);
✅ Yeni Kod:
DB::table('model_has_roles')->insert([
'role_id' => $role->id,
'model_type' => 'User', // morphMap uyumlu
'model_id' => $user->id
]);
📁 Dosya:
app/Models/User.php
Yeni Method Eklendi:
public function flushRoleCache(): void
{
app(\Spatie\Permission\PermissionRegistrar::class)
->forgetCachedPermissions();
$this->unsetRelation('roles');
$this->unsetRelation('permissions');
\Cache::forget("user_{$this->id}_roles");
\Cache::forget("user_{$this->id}_permissions");
}
Tüm model_type sorguları morphMap uyumlu hale getirildi:
// Rol silme
->where('model_type', 'User')
// Rol arama
->where('model_type', 'User')
// Rol ekleme
'model_type' => 'User'
Test Senaryoları:
app/Models/User.php
+ flushRoleCache() method
+ roles() method: ->withoutGlobalScopes()
Modules/UserManagement/app/Http/Livewire/UserManageComponent.php
handleRoleAndPermissions(): model_type standardizasyonu
Tüm sorgular 'User' (morphMap uyumlu) kullanıyor
Polymorphic relationship'lerde morphMap tanımlandıysa, veritabanına yazma ve okuma işlemlerinde aynı format kullanılmalı. Aksi halde query binding uyumsuzluğu oluşur.
Spatie Permission'da rol değişikliklerinde Eloquent relationship cache'i temizlenmeli. Sadece global permission cache değil, model-level cache de flush edilmeli.
model_type gibi polymorphic anahtar sütunlarda format tutarsızlığı (duplicate formatlar) ciddi sorunlara yol açabilir. Düzenli data audit gerekli.
Eloquent sorgusu doğru ama sonuç yanlışsa, SQL binding'leri kontrol et. Raw SQL query ile Eloquent sonuçlarını karşılaştır.