Proje: OkulUp API · Hub: OkulUp API — Decisions
SchoolSetting — JSON Kolonu ile Feature/Policy Yönetimi
Karar
Her okul için özelleştirilebilir ayarlar (features, policies, branding, support) ayrı tablolar değil, school_settings tablosundaki JSON kolonlarında saklanır.
Neden
- Feature sayısı zamanla değişiyor — her yeni özellik için migration yazmak yerine JSON array’e ekleme yeterli
- DEFAULT_FEATURES sabitine ekleme → tüm mevcut okullara otomatik uygulanır (merge logic)
- Tek kayıt per okul → okul başına 1 row, join basit
- Policy ve branding da aynı pattern — tutarlılık
Nasıl Çalışır
// DEFAULT ile DB değerleri merge edilir
getResolvedFeatures() = array_merge(DEFAULT_FEATURES, $this->features ?? [])
// SchoolSetting yoksa otomatik oluşturulur:
$school->getOrCreateSettings()Alternatifler
- Ayrı bool kolonlar: Her yeni feature için migration
- EAV (Entity-Attribute-Value): Overkill ve complex query
- Ayrı tablo per özellik: Join karmaşıklığı
Dezavantaj
PHPStan için JSON array shape tanımlamak gerekiyor (@property array<string, mixed>).
Related
- feature-flag-sistemi — SchoolSetting feature kullanımı
- api-kod-konvansiyonlari — model patterns