📅 Tarih: 2025-11-30 |
🎯 Modül: SettingManagement |
👤 Analiz: Sistem Mimarisi, Form Builder, Veritabanı, Hardcode Sorunları
🏗️ Sistem Mimarisi
Genel Bakış
SettingManagement modülü, multi-tenant sistemde merkezi ayar yönetimi sağlar.
3-katmanlı bir yapıya sahiptir: SettingGroup (gruplar),
Setting (ayar tanımları),
SettingValue (tenant'a özel değerler).
Form yapısını saklar (FormBuilder tarafından oluşturulur)
is_active
boolean
Grup aktif mi?
💡 ÖNEMLİ:layout kolonu form yapısını JSON formatında saklar.
Bu JSON, FormBuilder ile görsel olarak oluşturulur ve ValuesComponent tarafından render edilir.
⚠️ DİKKAT:settings tablosu Central DB'de!
Ayar tanımları burada, ayar değerleri her tenant'ın kendi DB'sinde.
3. settings_values (Tenant DB)
Kolon
Tip
Açıklama
id
bigint
Primary key
setting_id
bigint (unique)
Hangi setting? (FK: settings - cross-database)
value
text (nullable)
Tenant'a özel değer
Değer Öncelik Sistemi
Önce settings_values (Tenant DB) kontrol edilir
Değer yoksa settings.default_value (Central DB) kullanılır
O da yoksa setting($key, $fallback) fonksiyonuna verilen fallback döner
🎨 Form Builder Sistemi
Nasıl Çalışır?
Form Builder, görsel bir arayüz ile form elementlerini sürükle-bırak mantığıyla düzenlemenizi sağlar.
Oluşturulan form yapısı JSON formatındasettings_groups.layout kolonuna kaydedilir.
❌ Yeni seçenek eklemek için kod değişikliği gerekiyor
❌ FormBuilder'dan option eklenemiyor
❌ Çeviri (i18n) desteği yok
✅ Çözüm Önerileri ve Hedef Mimari
Hedef: %100 Database-Driven Sistem
Tüm ayarlar, form yapıları, layout'lar ve seçenekler sadece veritabanında olmalı.
Hiçbir hardcode kod olmamalı. FormBuilder ile her şey yönetilebilmeli.
1. Seeder Dosyalarını Kaldırma Stratejisi
Adım 1: Mevcut Ayarları DB'ye Aktar
Seeder dosyalarındaki tüm ayarları FormBuilder ile manuel olarak DB'ye kaydet:
✅ Her ayar grubu için FormBuilder aç
✅ Seeder'daki layout JSON'ını FormBuilder'a import et
✅ Kaydet → Otomatik olarak settings tablosuna eklenecek
✅ Seeder dosyasını sil veya devre dışı bırak
Adım 2: Seeder Yerine Migration Kullan
İlk kurulum için migration kullan, sonraki değişiklikler FormBuilder ile:
✅ Migration: Sadece SettingGroup oluştur (isim, slug, icon)
// Yeni tablo: setting_options
- id
- setting_id (FK: settings)
- option_key (örn: sales_expert)
- option_label (örn: Satış Uzmanı)
- order
✅ Dinamik option yönetimi
✅ Çeviri desteği eklenebilir
✅ Option başına ek metadata eklenebilir
❌ Daha karmaşık yapı
3. Layout JSON Yönetimi
Mevcut Sistem Yeterli!
settings_groups.layout kolonu zaten JSON formatında form yapısını saklıyor.
Sorun layout'ın kendisinde değil, seeder dosyalarında hardcode edilmesinde!
Yapılacak:
✅ Seeder'daki getThemeSettingsLayout() gibi metodları kaldır
✅ Layout JSON'ları FormBuilder ile oluştur
✅ DB'de saklanan layout'ları kullan
✅ Seed'de layout = null olsun (admin panelde manuel oluşturulsun)
FormBuilder'ın sağ panel'inde select element seçildiğinde:
✅ "Options" sekmesi ekle
✅ Key-Value pair ekleme arayüzü
✅ Sürükle-bırak ile sıralama
✅ Kaydet düğmesi ile settings.options JSON'a kaydet
📋 Aksiyon Planı (Adım Adım)
Faz 1: Mevcut Durumu Temizleme
Seeder Kontrolü
Hangi seeder'lar layout JSON içeriyor? → Tespit et
Hangi ayarlar hardcode? → Liste çıkar
DB Export
Mevcut settings_groups tablosunu export et
Mevcut settings tablosunu export et
Layout JSON'larını ayrı dosyalara kaydet (backup)
Seeder Cleanup
Tüm seeder dosyalarından layout JSON'larını kaldır
Setting array'lerini kaldır
Sadece SettingGroup tanımları kalsın (isim, slug, icon)
Faz 2: FormBuilder ile Yeniden Oluşturma
Her Grup için:
Admin panel → SettingManagement → Form Builder aç
Eski layout JSON'ı import et (gerekirse manuel ekle)
Kaydet → Otomatik olarak settings tablosuna eklenecek
Test Et:
Values sayfasını aç
Tüm alanların göründüğünü doğrula
Kaydetmeyi test et
Faz 3: Select Options Yönetimi
FormBuilder Geliştirme:
Properties panel'e "Options" tab ekle
Key-Value input alanları ekle
Add/Remove button'ları ekle
Kaydetme işlemini güncelle
Mevcut Options'ları Aktar:
Seeder'dan options JSON'larını DB'ye kopyala
FormBuilder ile düzenlenebilir yap
Faz 4: Migration Düzenleme
İlk Kurulum Migration:
Sadece SettingGroup kayıtları oluştur
Layout = null bırak
Admin panelde manuel FormBuilder ile oluşturulsun
Production Migration:
Mevcut layout JSON'ları DB'den al
Migration'da layout'ları ekle (tek seferlik)
Sonrasında tüm değişiklikler FormBuilder ile
Faz 5: Doğrulama ve Dokümantasyon
Test Senaryoları:
✅ FormBuilder ile yeni grup oluşturma
✅ Form element ekleme/çıkarma
✅ Select options ekleme
✅ Layout değiştirme
✅ Values sayfasında kaydetme
✅ setting() helper ile okuma
Dokümantasyon:
Yeni setting grubu oluşturma kılavuzu
FormBuilder kullanım kılavuzu
Seeder yerine FormBuilder kullanma
⚠️ Kritik Notlar
🚨 SEED OVERWRITE RİSKİ
Seeder dosyaları her çalıştığında DB'deki layout JSON'ı override ediyor!
Admin panelde FormBuilder ile yaptığınız değişiklikler seed sonrası kaybolabilir.
Çözüm: Seeder dosyalarını tamamen kaldır veya sadece ilk kurulumda çalışsın.
⚠️ MULTI-TENANT DİKKAT
- settings_groups ve settings → Central DB
- settings_values → Tenant DB
- Yeni grup/ayar eklerken tüm tenant'lar otomatik görür
- Değerler tenant'a özgü
💡 CACHE YÖNETİMİ
- setting() helper 3600 saniye (1 saat) cache kullanıyor
- SettingValue model save/delete olunca cache otomatik temizleniyor
- Manuel temizlik: setting_clear_cache()
📊 Özet ve Sonuç
Mevcut Durum
✅ Form Builder sistemi güçlü ve çalışıyor
✅ Layout JSON yapısı esnek
✅ Otomatik setting senkronizasyonu var
❌ Seeder dosyalarında 1000+ satır hardcode kod
❌ Layout JSON'lar PHP kodunda
❌ Select options hardcode
❌ Group ID'ler sabit
Hedef Durum
✅ %100 database-driven sistem
✅ Tüm ayarlar FormBuilder ile yönetilsin
✅ Hiç hardcode kod kalmasın
✅ Select options FormBuilder'dan eklenebilsin
✅ Layout JSON sadece DB'de olsun
✅ Seeder dosyaları minimal olsun (sadece grup tanımları)