Proje: Okul Platform · Hub: Okul Platform — Conventions

Banner show/hide pattern: configs tablosu + admin panel

Rule

Yeni bir homepage/listing/detail banner’ı eklerken görünürlüğü configs tablosundan oku. Dosya-bazlı config (config/xxx.php veya env()) KULLANMA — admin panel panel/banner route’undan gelen toggle’ı dinleyemeyiz.

Neden

  • Admin panel (BannerController@update) configs.item_value=0|1 + status satırını günceller
  • Controller cache()->forget($bannerType) + ordered_homepage_banners cache’i temizler
  • Panel listeleme sayfası Config::getAllBanners() ile type LIKE '%_banner_show_status' sorgulayıp tüm banner type’larını listeler — yeni eklenen otomatik çıkar
  • Config dosyasından okursak admin toggle’ı hiçbir işe yaramaz

5 adımlı banner ekleme şablonu

1. Seeder (DB satırı)

database/seeds/XxxBannerConfigSeeder.php:

Config::firstOrCreate(
    ['type' => 'homepage_xxx_banner_show_status', 'item_id' => 1],
    ['type' => 'homepage_xxx_banner_show_status', 'item_id' => 1,
     'item_value' => '0', 'status' => '0', 'description' => '10'],
);
cache()->forget('ordered_homepage_banners');

Çalıştır: php artisan db:seed --class=Database\\Seeders\\XxxBannerConfigSeeder

2. app/Models/Config.php — okuma method’u

public function getHomepageXxxBannerShowStatus()
{
    return cache()->remember('homepage_xxx_banner_show_status', 24 * 60 * 7, function () {
        $banner = $this->where('type', 'homepage_xxx_banner_show_status')->where('status', '1')->first();
        return $banner ? $banner->item_value : 0;
    });
}

3. Config::getBannerDisplayName() — panel listesi label’ı

'homepage_xxx_banner_show_status' => 'Homepage - XXX Banner',

4. Banner partial (Blade) — self-gating

resources/views/frontend/includes/xxx-banner.blade.php:

@php $show = app(\App\Models\Config::class)->getHomepageXxxBannerShowStatus(); @endphp
@if($show)
    {{-- Banner HTML + gaSendEventNavigation onclick --}}
@endif

5. resources/views/frontend/index.blade.php — include

Self-gating partial için tek satır:

@include('frontend.includes.xxx-banner')

Cache invalidasyon: panel BannerController::clearBannerCache($type) + ordered_homepage_banners otomatik temizler. Ekstra iş yok.

Hızlı test

# DB kontrol
php artisan tinker
  \App\Models\Config::where('type','like','%xxx%_banner%')->get(['type','status','item_value']);
 
# Panel listesinde görünüyor mu?
  \App\Models\Config::getAllBanners()->where('type','like','%xxx%');

Gerçek örnek — 2026-04-15 Profiling banners

Profiling modülü için eklenenler:

  • homepage_profiling_test_banner_show_status
  • homepage_profiling_finder_banner_show_status

Dosyalar:

  • database/seeds/ProfilingBannerConfigSeeder.php
  • app/Models/Config.phpgetHomepageProfilingTestBannerShowStatus() + Finder versiyonu
  • resources/views/frontend/includes/profiling-banners.blade.php (self-gating, iki banner tek partial)
  • resources/views/frontend/index.blade.php@include('frontend.includes.profiling-banners')

Caught case (2026-04-15)

İlk iterasyonda config/profiling.php + env('PROFILING_BANNER_TEST_ENABLED') yaklaşımını denedim. User flagladı: “bizim configs tablomuz var oradan takip ediliyor, panel/banner routeundaki kullanim gibi”. Dosya silindi, Config model pattern’ine geçildi.

Ders: Bir banner/feature-flag eklerken önce mevcut admin panel bulgusunu yap — UI’dan toggle edilebilir olması büyük olasılıkla zaten bir DB config pattern’i kullanır.

  • 2026-04-15-profiling-event-taxonomy — profiling event helper hierarchy
  • Panel route: routes/panel.phppanel.banner.index / panel.banner.update
  • Controller: app/Http/Controllers/Panel/BannerController.php
  • Config model: app/Models/Config.phpgetAllBanners(), getOrderedHomepageBanners(), getBannerDisplayName()