# LikaWEB Coklu Site Mimari Raporu

> Durum: Arsiv / gecersiz karar.
>
> Bu rapordaki multi-site, `site_id`, domain resolver ve tek panelden coklu site yonetimi onerileri nihai mimari karar ile iptal edilmistir. Gecerli karar icin bkz: [LikaWEB CMS Nihai Mimari Karar, Urun Vizyonu ve Teknik Yol Haritasi](./likaweb-cms-nihai-mimari-yol-haritasi.md).

## 1. Amac

LikaWEB'in tek bir kod tabaniyla birden fazla web sitesini calistirabilecek hale getirilmesi hedefleniyor. Ornek siteler:

- `likayazilim.com`
- `likaone.com`
- `firsatharitasi.com`
- `marketkurdu.com`

Ana fikir su olmali: kod ayni kalir, siteye ozel marka, icerik, domain, tema, sayfalar, urunler ve formlar veritabanindan degisir. Boylece her yeni site icin yeni Laravel projesi acmak yerine, mevcut LikaWEB bir "coklu site platformu" haline gelir.

## 2. Kisa Sonuc

Mevcut LikaWEB iyi bir baslangic iskeleti sunuyor: ana sayfa bolumleri, urunler, sayfalar, ayarlar, demo talepleri ve admin paneli zaten var. Ancak su anda uygulama tek site varsayimiyla yazilmis durumda. Coklu site icin ana degisiklik, tum icerik tablolarina `site_id` eklemek ve gelen domain'e gore aktif siteyi bulup tum okuma/yazma islemlerini o siteye baglamak olacak.

Onerilen hedef mimari:

1. Tek Laravel kod tabani.
2. Tek veritabani.
3. Her domain icin bir `site` kaydi.
4. Icerik tablolarinda `site_id`.
5. Admin panelinde "hangi siteyi yonetiyorum?" secici.
6. Siteye ozel logo, renk, menu, SEO, iletisim ve form ayarlari.
7. Ortak Blade bilesenleri ve tema tokenlari.

Bu yaklasim, yeni site acmayi "kod yazma isi" olmaktan cikarip "site olustur, domain ekle, tema/icerik gir, yayinla" akisine cevirir.

## 3. Mevcut Durum Analizi

### 3.1 Rotalar tek siteye gore

Mevcut rota yapisinda ana sayfa ve uye ol sayfasi sabit:

- `routes/web.php:16` -> `/` dogrudan `AnaSayfaController`
- `routes/web.php:18` -> `/uye-ol` dogrudan `register` view
- `routes/web.php:25` -> `/admin` tek ortak admin prefix'i

Bu yapida `likayazilim.com/`, `firsatharitasi.com/` ve `marketkurdu.com/` ayni veriyi gosterir. Domain'e gore site ayrimi yok.

### 3.2 Controller sorgulari site filtresi kullanmiyor

`app/Http/Controllers/AnaSayfaController.php` icinde:

- `AnaSayfaBolumu::query()` ile tum ana sayfa bolumleri aliniyor.
- `Ayar::degerler()` global ayarlari getiriyor.
- `Urun::query()->where('durum', 'aktif')` tum aktif urunleri getiriyor.

Ilgili satirlar:

- `app/Http/Controllers/AnaSayfaController.php:14`
- `app/Http/Controllers/AnaSayfaController.php:29`
- `app/Http/Controllers/AnaSayfaController.php:35`

Coklu site icin bu sorgularin hepsi aktif siteye gore filtrelenmeli.

### 3.3 Modellerde site baglantisi yok

Su modellerde `site_id` veya site iliskisi yok:

- `app/Models/Ayar.php`
- `app/Models/AnaSayfaBolumu.php`
- `app/Models/Sayfa.php`
- `app/Models/Urun.php`
- `app/Models/DemoTalebi.php`
- `app/Models/UyelikTalebi.php`

Ornegin `Ayar::degerler()` ayarlari `anahtar => deger` olarak global cekiyor. Bu, `likayazilim.com` ve `marketkurdu.com` icin farkli `site_adi`, `logo`, `email`, `telefon` gibi degerleri ayni tabloda ayirmaya izin vermiyor.

### 3.4 Veritabani unique kurallari tek siteye gore

Migration icinde bazi alanlar global unique:

- `sayfalar.slug` unique: `database/migrations/2026_05_06_000004_turkce_admin_tablo_yapisi.php:32`
- `ana_sayfa_bolumleri.bolum` unique: `database/migrations/2026_05_06_000004_turkce_admin_tablo_yapisi.php:47`
- `urunler.slug` unique: `database/migrations/2026_05_06_000004_turkce_admin_tablo_yapisi.php:64`
- `ayarlar.anahtar` unique: `database/migrations/2026_05_06_000004_turkce_admin_tablo_yapisi.php:116`

Coklu site icin ayni slug farkli sitelerde tekrar edebilmelidir. Ornegin:

- `likayazilim.com/hakkimizda`
- `likaone.com/hakkimizda`
- `marketkurdu.com/hakkimizda`

Bu yuzden unique kurallar `site_id + slug`, `site_id + bolum`, `site_id + anahtar` seklinde birlesik unique index'e donmelidir.

### 3.5 View dosyalarinda marka ve icerik sabit

`resources/views/layouts/site.blade.php` icinde Lika Yazilim markasi, logo harfi, menu, footer e-postasi ve CTA butonlari sabit yazilmis:

- Meta aciklama: `resources/views/layouts/site.blade.php:6`
- Varsayilan title: `resources/views/layouts/site.blade.php:8`
- Marka alani: `resources/views/layouts/site.blade.php:14`
- Logo harfi: `resources/views/layouts/site.blade.php:15`
- Marka metni: `resources/views/layouts/site.blade.php:16`
- Footer e-posta: `resources/views/layouts/site.blade.php:69`

`resources/views/welcome.blade.php` icinde de Lika Yazilim ve Firsat Haritasi odakli fallback metinleri var:

- Sayfa title: `resources/views/welcome.blade.php:3`
- Hero fallback aciklamasi: `resources/views/welcome.blade.php:28`

`resources/views/register.blade.php` ise direkt Firsat Haritasi uyeligi icin yazilmis. Bu sayfa her sitede ayni sekilde gosterilmemeli; bazi sitelerde "Uye Ol", bazi sitelerde "Teklif Al", bazi sitelerde hic olmayabilir.

### 3.6 Tema renkleri statik CSS icinde

`public/assets/site/css/site.css` icindeki renkler CSS degiskeni olarak tanimlanmis:

- `--bg`: `public/assets/site/css/site.css:2`
- `--ink`: `public/assets/site/css/site.css:5`
- `--primary`: `public/assets/site/css/site.css:8`
- `--accent`: `public/assets/site/css/site.css:10`

Bu iyi bir temel. Coklu site icin bu degiskenler site ayarlarindan beslenebilir. Ornegin Lika Yazilim yesil/turuncu kalirken, Market Kurdu daha ticaret odakli farkli bir palet kullanabilir.

## 4. Hedef Mimari

### 4.1 Tavsiye edilen model: tek kod, tek veritabani, site bazli veri

Bu proje icin en uygun model "single codebase, single database, tenant/site scoped data" modelidir.

Alternatifler:

- Her site icin ayri Laravel kurulumu: basit baslar ama bakim maliyeti hizla artar.
- Tek kod, her siteye ayri veritabani: veri izolasyonu guclu olur ama admin, deploy, migration ve raporlama karmasiklasir.
- Tek kod, tek veritabani, `site_id`: mevcut LikaWEB icin en pratik ve olceklenebilir secenek.

Onerilen secenek: tek kod, tek veritabani, tum siteye ozel kayitlarda `site_id`.

## 5. Gerekli Veritabani Degisiklikleri

### 5.1 Yeni `siteler` tablosu

Her web sitesi icin ana kayit tutulmali.

Onerilen alanlar:

- `site_id`
- `ad`
- `slug`
- `varsayilan_domain`
- `durum`: `aktif`, `pasif`, `bakimda`
- `locale`: varsayilan `tr`
- `timezone`: varsayilan `Europe/Istanbul`
- `tema`: JSON
- `logo`
- `favicon`
- `meta_baslik`
- `meta_aciklama`
- `analytics_kodu`
- `olusturulma_tarihi`
- `guncellenme_tarihi`
- `silinme_tarihi`

Ornek kayitlar:

| ad | slug | varsayilan_domain |
| --- | --- | --- |
| Lika Yazilim | `likayazilim` | `likayazilim.com` |
| Lika One | `likaone` | `likaone.com` |
| Firsat Haritasi | `firsat-haritasi` | `firsatharitasi.com` |
| Market Kurdu | `market-kurdu` | `marketkurdu.com` |

### 5.2 Yeni `site_domainleri` tablosu

Bir sitenin birden fazla domaini olabilir:

- `likayazilim.com`
- `www.likayazilim.com`
- `staging.likayazilim.com`
- `localhost`

Onerilen alanlar:

- `site_domain_id`
- `site_id`
- `domain`
- `birincil_mi`
- `durum`
- timestamp alanlari

`domain` global unique olmali. Bir domain sadece bir siteye ait olabilir.

### 5.3 Icerik tablolarina `site_id` eklenmeli

Su tablolara `site_id` eklenmeli:

- `ayarlar`
- `ana_sayfa_bolumleri`
- `urunler`
- `sayfalar`
- `demo_talepleri`
- `uyelik_talepleri`

Ek olarak gerekirse:

- `menuler`
- `menu_ogeleri`
- `site_varliklari`
- `form_tanimlari`
- `seo_yonlendirmeleri`

### 5.4 Unique index'ler site bazli olmali

Mevcut global unique kurallar kaldirilmali, yerine sunlar gelmeli:

- `sayfalar`: unique `site_id, slug`
- `urunler`: unique `site_id, slug`
- `ana_sayfa_bolumleri`: unique `site_id, bolum`
- `ayarlar`: unique `site_id, anahtar`

Bunun sonucu:

- Her sitede `hakkimizda` slug'i olabilir.
- Her sitede `hero` ana sayfa bolumu olabilir.
- Her sitede `site_adi`, `logo`, `email` ayari olabilir.

### 5.5 Yoneticiler ve yetki modeli

Mevcut `yoneticiler` tablosu global. Coklu site icin iki yaklasim var:

1. `yoneticiler` global kalir, `site_yonetici` pivot tablosuyla hangi yonetici hangi siteyi yonetir belirlenir.
2. Her yonetici tek siteye ait olur ve `yoneticiler.site_id` eklenir.

Oneri: birinci yaklasim.

Neden:

- Bir super admin tum siteleri yonetebilir.
- Bir editor sadece `firsatharitasi.com` sitesini yonetebilir.
- Ayni kisi birden fazla siteye yetki alabilir.

Onerilen tablolar:

- `roller`: `super_admin`, `site_admin`, `editor`, `lead_viewer`
- `site_yonetici`: `site_id`, `yonetici_id`, `rol`

## 6. Domain'e Gore Site Bulma

### 6.1 `ResolveSite` middleware

Her public request'te gelen host okunmali:

```php
$host = $request->getHost();
```

Sonra `site_domainleri.domain` alaninda aranip aktif site bulunmali. Bulunan site request'e ve container'a baglanmali:

```php
$request->attributes->set('site', $site);
app()->instance(CurrentSite::class, new CurrentSite($site));
```

Boylece controller, model scope ve view'lar aktif siteyi okuyabilir.

### 6.2 Fallback davranisi

Domain bulunamazsa uc secenek var:

1. 404 goster.
2. Varsayilan siteye yonlendir.
3. `APP_ENV=local` ise `DEFAULT_SITE_SLUG` sitesini kullan.

Oneri:

- Production: bilinmeyen domain 404.
- Local/staging: `DEFAULT_SITE_SLUG=likayazilim` fallback.

## 7. Model ve Query Degisiklikleri

### 7.1 Ortak site scope'u

Siteye bagli modeller icin ortak trait yazilabilir:

- `BelongsToSite`
- `scopeForSite($query, Site|int $site)`
- `site()` iliskisi

Ornek:

```php
public function scopeForSite($query, Site|int $site)
{
    return $query->where('site_id', $site instanceof Site ? $site->getKey() : $site);
}
```

### 7.2 Global scope kullanimi dikkatli olmali

Global scope her sorguya otomatik `site_id` ekler. Bu public tarafta pratik olabilir ama admin raporlari, super admin ekranlari ve migration/backfill islemlerinde sorun cikarabilir.

Oneri:

- Baslangicta acik `forSite($site)` scope'u kullanilsin.
- Kritik noktalarda testler oturduktan sonra otomatik scope dusunulsun.

### 7.3 Ayar okuma site bazli olmali

Mevcut:

```php
Ayar::degerler()
```

Onerilen:

```php
Ayar::degerler($site)
```

Cache ile:

```php
Cache::remember("site:{$site->site_id}:ayarlar", 3600, fn () => ...);
```

Admin'de ayar guncellenince sadece ilgili sitenin cache'i temizlenmeli.

## 8. Controller Degisiklikleri

### 8.1 Public ana sayfa

`AnaSayfaController` aktif siteyi alarak calismali:

- Ana sayfa bolumleri: `AnaSayfaBolumu::forSite($site)`
- Ayarlar: `Ayar::degerler($site)`
- Urunler: `Urun::forSite($site)->where('durum', 'aktif')`

Bu sayede her domain ayni controller'i kullanir ama farkli veri gosterir.

### 8.2 Demo ve uyelik talepleri

`DemoTalebiSiteController` ve `UyelikTalebiController` kayit olustururken `site_id` yazmali.

Onerilen ek alanlar:

- `site_id`
- `form_tipi`
- `kaynak_url`
- `utm_source`
- `utm_medium`
- `utm_campaign`
- `ip_adresi`
- `user_agent`

Bu sayede hangi sitenin hangi kampanyadan lead aldigi izlenebilir.

### 8.3 Admin controller'lari

Tum admin controller'lari secili siteye gore filtrelenmeli:

- `AyarController`
- `AnaSayfaBolumuController`
- `UrunController`
- `SayfaController`
- `DemoTalebiController`
- `DashboardController`

Ornek:

```php
$site = $request->user()->aktifSite();

Urun::forSite($site)->orderBy('sira')->paginate(12);
```

Route model binding icin de kaydin secili siteye ait oldugu dogrulanmali. Aksi halde bir admin URL'yi degistirerek baska sitenin kaydini duzenleyebilir.

## 9. View ve Bilesen Degisiklikleri

### 9.1 Layout marka verisini dinamik almali

`resources/views/layouts/site.blade.php` icindeki sabit degerler su kaynaklardan gelmeli:

- `$site->ad`
- `$site->logo`
- `$site->favicon`
- `$ayarlar['site_slogani']`
- `$ayarlar['email']`
- `$ayarlar['telefon']`
- `$site->meta_baslik`
- `$site->meta_aciklama`

Sabit `Lika Yazilim`, `L` logo harfi, `info@likayazilim.com` gibi degerler kaldirilmali.

### 9.2 Menu veritabanindan gelmeli

Simdiki menu sabit:

- Urunler
- Ozellikler
- Surec
- Iletisim

Coklu site icin menu farkli olabilir:

- Lika Yazilim: Urunler, Cozumler, Referanslar, Iletisim
- Firsat Haritasi: Ozellikler, Paketler, Uye Ol, Iletisim
- Market Kurdu: Kategoriler, Avantajlar, Basvuru, Iletisim

Onerilen yeni tablolar:

- `menuler`: `site_id`, `konum`, `ad`
- `menu_ogeleri`: `menu_id`, `etiket`, `tip`, `hedef`, `sira`, `durum`

Baslangic icin menu JSON olarak `ayarlar` icinde tutulabilir. Ama orta vadede tablo daha saglikli olur.

### 9.3 Ana sayfa bolumleri ortak bilesenlere ayrilmali

`welcome.blade.php` cok buyuyor ve siteye ozel fallback metinler tasiyor. Onerilen bilesenler:

- `components/site/hero.blade.php`
- `components/site/product-grid.blade.php`
- `components/site/conversion-strip.blade.php`
- `components/site/features.blade.php`
- `components/site/process.blade.php`
- `components/site/references.blade.php`
- `components/site/demo-modal.blade.php`

Bu bilesenler ayni kalir, icerik veritabanindan gelir.

### 9.4 Sablon/tema varyasyonu

Tum siteler ayni bolumlere sahip olmayabilir. Bu yuzden `siteler` tablosunda `tema_adi` veya `sablon` alani tutulabilir:

- `corporate_software`: Lika Yazilim
- `saas_product`: Lika One veya Firsat Haritasi
- `marketplace`: Market Kurdu

Ilk fazda tek sablon yeterli olabilir. Ikinci fazda sablon varyasyonlari eklenebilir.

## 10. Tema ve Gorsel Varliklar

### 10.1 CSS degiskenleri site ayarlarindan beslenmeli

Mevcut CSS degiskenleri korunabilir:

- `--bg`
- `--surface`
- `--ink`
- `--primary`
- `--accent`
- `--radius`

Layout icinde site temasina gore inline style basilebilir:

```blade
<style>
    :root {
        --primary: {{ $tema['primary'] ?? '#0f766e' }};
        --accent: {{ $tema['accent'] ?? '#f59e0b' }};
    }
</style>
```

### 10.2 Logo, favicon ve medya yonetimi

Yeni site acarken su varliklar yuklenebilmeli:

- Logo
- Favicon
- Hero gorseli
- Open Graph gorseli
- Urun gorselleri
- Referans logolari

Dosya yolu oneri:

```text
storage/app/public/sites/{site_slug}/...
```

Public URL:

```text
/storage/sites/{site_slug}/logo.svg
```

Bu yapi marka dosyalarinin birbirine karismasini engeller.

## 11. Admin Panel Degisiklikleri

### 11.1 Yeni "Siteler" modulu

Super admin icin yeni bir menu:

- Siteler
- Site ekle
- Domainler
- Tema
- Varsayilan ayarlar
- Icerik kopyalama

Site eklerken:

1. Site adi girilir.
2. Slug girilir.
3. Domainler eklenir.
4. Tema renkleri secilir.
5. Baslangic sablonu secilir.
6. Varsayilan ana sayfa bolumleri olusturulur.

### 11.2 Admin topbar site secici

Admin panelinde topbar'a site secici eklenmeli:

```text
[Lika Yazilim v]
```

Secili site session'da tutulabilir:

```php
session(['admin_site_id' => $site->site_id]);
```

Tum admin ekranlari bu siteye gore calisir.

### 11.3 Yetki kontrolleri

Kurallar:

- `super_admin`: tum siteler
- `site_admin`: yetkili oldugu sitenin tum icerigi
- `editor`: sayfa, urun, ana sayfa bolumleri
- `lead_viewer`: demo/uyelik talepleri

Yetki kontrolu controller seviyesinde veya policy ile yapilmali.

### 11.4 Icerik kopyalama

Yeni site acarken mevcut bir siteden kopyalama cok faydali olur:

- Ana sayfa bolumleri
- Urunler
- Sayfalar
- Ayarlar
- Menu yapisi

Ornek akis:

```text
Yeni site: likaone.com
Kaynak sablon: Lika Yazilim
Kopyalanacaklar: ana sayfa + ayarlar + menu
```

Sonra sadece metin ve tema degistirilir.

## 12. SEO, Sitemap ve Robots

Coklu siteye gecince SEO ayarlari site bazli olmalidir:

- Site meta title
- Site meta description
- Sayfa meta title
- Sayfa meta description
- Open Graph gorseli
- Canonical URL
- Robots ayari
- Sitemap

Onerilen route'lar:

- `/robots.txt`: aktif siteye gore uretilir.
- `/sitemap.xml`: aktif siteye ait aktif sayfa/urun URL'lerini verir.

`APP_URL` tek domain icin yeterli olmayacagi icin public URL uretiminde aktif site domain'i dikkate alinmali.

## 13. Formlar ve Lead Yonetimi

### 13.1 Formlar siteye gore degismeli

Su anda demo formu ortak, uye ol formu Firsat Haritasi odakli. Yeni yapida form davranisi siteye gore tanimlanmali:

- Lika Yazilim: demo talebi
- Lika One: demo veya teklif talebi
- Firsat Haritasi: uyelik talebi + demo
- Market Kurdu: basvuru veya teklif talebi

Baslangic icin `form_tipi` alani yeterli:

- `demo`
- `uyelik`
- `teklif`
- `basvuru`

### 13.2 Talepler site bazli listelenmeli

Admin panelinde talepler:

- Secili siteye gore filtrelenmeli.
- Super admin tum siteleri gorebilmeli.
- Talep listesinde site adi gosterilmeli.

## 14. Cache Stratejisi

Coklu site yapisinda cache anahtarlari site bazli olmalidir:

- `site:{site_id}:ayarlar`
- `site:{site_id}:ana_sayfa`
- `site:{site_id}:menu:header`
- `site:{site_id}:sitemap`

Admin'de ilgili veri guncellenince sadece o sitenin cache'i temizlenmeli.

Yanlis cache anahtari kullanilirsa bir sitenin icerigi diger sitede gorunebilir. Bu yuzden cache izolasyonu kritik.

## 15. Deployment ve Altyapi

### 15.1 Domainler ayni uygulamaya yonlenmeli

Tum domainler ayni Laravel uygulamasina gider:

```text
likayazilim.com      -> LikaWEB Laravel app
www.likayazilim.com  -> LikaWEB Laravel app
likaone.com          -> LikaWEB Laravel app
firsatharitasi.com   -> LikaWEB Laravel app
marketkurdu.com      -> LikaWEB Laravel app
```

Web server tarafinda `server_name` listesi veya wildcard uygun sekilde ayarlanir.

### 15.2 SSL

Her domain icin SSL sertifikasi gerekir. Let's Encrypt veya hosting paneli ile otomatik yenileme kurulmalidir.

### 15.3 `APP_URL` kullanimi

Laravel'in `APP_URL` ayari tek domain icindir. Coklu site yapisinda:

- Linkler request host'u uzerinden uretilmeli.
- E-posta, sitemap, canonical gibi request disi islemlerde sitenin `varsayilan_domain` alani kullanilmali.

## 16. Gecis Plani

### Faz 1: Altyapi ve veri modeli

- `siteler` tablosu eklenir.
- `site_domainleri` tablosu eklenir.
- Mevcut veri icin `likayazilim` sitesi olusturulur.
- Icerik tablolarina nullable `site_id` eklenir.
- Mevcut kayitlar `likayazilim` sitesine baglanir.
- `site_id` zorunlu hale getirilir.
- Unique index'ler birlesik unique index'e donusturulur.

### Faz 2: Public site resolver

- `ResolveSite` middleware yazilir.
- Aktif site request/container icine konur.
- `AnaSayfaController`, demo ve uyelik controller'lari aktif siteye gore duzenlenir.
- Layout'a `$site` ve site ayarlari verilir.

### Faz 3: Admin panel site secici

- Admin topbar'a site secici eklenir.
- Tum admin listeleri secili siteye gore filtrelenir.
- Yeni kayitlar secili siteye baglanir.
- Route model binding/policy ile baska sitenin kaydina erisim engellenir.

### Faz 4: Tema, menu ve medya

- Site bazli tema JSON'u kullanilir.
- Logo/favicon/renkler admin'den duzenlenir.
- Menu verisi site bazli hale getirilir.
- Upload yolu site slug'ina gore ayrilir.

### Faz 5: Yeni site olusturma akisi

- "Site ekle" ekrani yazilir.
- Varsayilan sablon secimi eklenir.
- Mevcut siteden icerik kopyalama eklenir.
- `likaone.com`, `firsatharitasi.com`, `marketkurdu.com` kayitlari olusturulur.

### Faz 6: Test, SEO ve yayin

- Host bazli testler yazilir.
- Sitemap/robots site bazli uretilir.
- SSL ve DNS ayarlari tamamlanir.
- Staging'de her domain kontrol edilir.
- Production'a kontrollu gecis yapilir.

## 17. Test Senaryolari

Mutlaka eklenmesi gereken testler:

1. `likayazilim.com` host'u Lika Yazilim sitesini cozer.
2. `firsatharitasi.com` host'u Firsat Haritasi sitesini cozer.
3. Ayni `/` route'u farkli hostlarda farkli hero basligi gosterir.
4. Ayni `hakkimizda` slug'i iki farkli sitede calisir.
5. Demo talebi gonderildiginde dogru `site_id` ile kaydolur.
6. Uyelik talebi dogru `site_id` ile kaydolur.
7. Admin secili site degistirdiginde urun listesi degisir.
8. Bir admin yetkisi olmayan sitenin kaydini URL degistirerek duzenleyemez.
9. Ayar cache'i site bazli ayrilir.
10. Site pasifse public request uygun hata veya bakim sayfasi verir.

## 18. Riskler ve Dikkat Edilecek Noktalar

### 18.1 Veri karismasi riski

En buyuk risk, sorgularda `site_id` filtresinin unutulmasidir. Bunu azaltmak icin:

- Ortak `forSite()` scope'u kullanilmali.
- Admin route model binding siteye gore kisitlanmali.
- Testler host bazli yazilmali.

### 18.2 Cache karismasi

Site ID icermeyen cache anahtarlari kullanilirsa bir sitenin ayari diger sitede gorunebilir. Tum cache key'lerde `site_id` bulunmali.

### 18.3 Eski unique index'ler

Migration gecisinde global unique index'ler dogru kaldirilmazsa yeni site icin `hakkimizda`, `hero`, `site_adi` gibi tekrar eden kayitlar eklenemez.

### 18.4 Admin yetkileri

Super admin ve site admin ayrimi net olmazsa, bir editor yanlislikla baska sitenin icerigini degistirebilir.

### 18.5 Form amaci farkliligi

`/uye-ol` her site icin dogru olmayabilir. Bazi sitelerde bu buton gizlenmeli, bazi sitelerde `basvuru`, `teklif-al`, `demo-talep-et` gibi farkli forma gitmelidir.

## 19. Oncelikli Is Listesi

En dogru uygulama sirasi:

1. `siteler` ve `site_domainleri` tablolarini ekle.
2. Mevcut veriyi `likayazilim` sitesine bagla.
3. Icerik tablolarina `site_id` ekle.
4. Unique index'leri `site_id + alan` seklinde degistir.
5. `ResolveSite` middleware yaz.
6. Public controller sorgularini site bazli yap.
7. Layout ve welcome view icindeki marka sabitlerini kaldir.
8. Admin paneline site secici ekle.
9. Admin CRUD sorgularini site bazli yap.
10. Demo/uyelik taleplerine `site_id` yaz.
11. Tema renklerini site ayarindan bas.
12. Menu ve footer'i site bazli yap.
13. Testleri ekle.
14. Yeni siteleri admin'den olustur.

## 20. Tahmini Efor

Mevcut kodun kapsamina gore yaklasik efor:

| Faz | Tahmini sure |
| --- | --- |
| Veri modeli ve migration | 1-2 gun |
| Site resolver ve public sorgular | 1-2 gun |
| Layout/view dinamiklestirme | 1-2 gun |
| Admin site secici ve CRUD filtreleri | 2-4 gun |
| Tema, logo, menu, medya | 2-3 gun |
| Testler ve gecis kontrolleri | 1-2 gun |
| Yeni site sablonlari ve icerik kopyalama | 2-4 gun |

Toplam: yaklasik 10-19 is gunu. Kapsam dar tutulursa ilk calisan coklu site altyapisi 1 hafta civarinda cikarilabilir; admin deneyimi, tema yonetimi ve kopyalama sihirbazi eklenirse 2-3 haftalik bir is olur.

## 21. Onerilen Nihai Hedef

LikaWEB su hale gelmeli:

1. Admin `Siteler` ekranindan yeni site acar.
2. Domainleri ekler.
3. Tema renklerini, logo ve favicon'u yukler.
4. Hazir sablondan ana sayfa bolumlerini olusturur.
5. Sayfa, urun, menu ve formlari siteye gore duzenler.
6. DNS domaini ayni Laravel uygulamasina yonlenir.
7. Kod degisikligi yapmadan yeni site yayina alinir.

Bu mimari kuruldugunda `likayazilim.com`, `likaone.com`, `firsatharitasi.com`, `marketkurdu.com` gibi siteler ayni kodu kullanir; sadece veri, tema ve domain farkli olur.
