PortfolioCategoryObserver → deleting() event
Kategoriye bağlı portfolio (proje/ürün içeriği) varsa silme işlemi engellenir.
Kontrol:
$category->portfolios()->count() > 0
Sonuç:
Silme işlemi başlatılmadan önce Log dosyasına kayıt atılır.
PortfolioCategoryService → deleteCategory()
Repository (veri erişim katmanı) üzerinden kategori kaydı veritabanından silinir.
Silme yöntemi: Soft Delete veya Hard Delete
• Soft Delete → Kayıt deleted_at ile işaretlenir, geri yüklenebilir
• Hard Delete → Kayıt tamamen silinir, geri dönüş yok
PortfolioCategoryObserver → deleted() event
Sistem performansı için cachelenen kategori verileri temizlenir. Böylece kullanıcılar güncel veriyi görür.
1. Tenant Cache Service
Prefix bazlı temizleme: portfolio_categories
2. Genel Cache Keys
portfolio_categories_list → Kategori listesiportfolio_categories_menu_cache → Menü cacheportfolio_category_detail_{id} → Spesifik kategori3. SEO Cache
universal_seo_portfolio_category_{id} → SEO meta verileri
4. Tag-Based Cache
Eğer cache store tag destekliyorsa:
['portfolio_categories', 'content'] tag'leri temizlenir
5. Response Cache (Spatie)
Tüm sayfa cache'leri temizlenir (full cache clear)
Kategoriye ait SEO meta verileri (title, description, keywords, og tags) de veritabanından silinir.
İlişkili tablo: seo_settings
Önemli: SEO ayarları kategoriye polymorphic (çok biçimli ilişki) olarak bağlıdır ve otomatik silinir.
Kullanıcı aktivite takibi için silme işlemi loglanır.
Silme işlemi başarıyla tamamlandıktan sonra detaylı Log kaydı atılır.
portfolios (hasMany)
Foreign Key: portfolio_category_id
⚠️ Portfolio varsa silme engellenir!
seoSetting (morphOne)
Polymorphic ilişki
✅ Otomatik silinir
parent (belongsTo)
Foreign Key: parent_id
Üst kategori referansı (nullable)
children (hasMany)
Alt kategoriler (recursive)
⚠️ Alt kategori kontrolü yok! (Potansiyel sorun)
Portfolio kategorisi category_image
media collection'ına sahip. Spatie Media Library kullanılıyor.
Silme Durumu:
Spatie Media Library, model silindiğinde ilişkili media dosyalarını otomatik siler
(eğer HasMedia trait'i doğru kullanılmışsa).
Media Silme:
deleting() event'inde
children kontrolü yok! Üst kategori silinirse alt kategorilerin
parent_id değeri orphan kalır.
Öneri:
Alt kategorisi olan kategori silinmeden önce hata fırlat veya
alt kategorileri parent_id = null yap.
forceDeleting() event'inde
sadece log kaydı var, ekstra kontrol yok. Kalıcı silme işlemi geri alınamaz!
Öneri:
Force delete öncesinde tüm ilişkileri kontrol et ve kullanıcıyı uyar.
calculateDepth()
metodunda circular reference
(döngüsel ilişki)
koruması var. İyi bir güvenlik önlemi!