# Mimariye Genel Bakış

https://dev.wisecp.com/tr/mimariye-genel-bakis

Bir istek girer, tek bir dağıtıcı bunun bir sayfa mı yoksa bir değişiklik mi olduğuna karar verir ve cevap HTML ya da JSON olarak döner. Geri kalan her şey bu cümleye hizmet eden bir katmandır.

## Genel Bakış

WISECP, kılık değiştirmiş genel amaçlı bir çatı değil, kendine ait bir MVC çatısıdır. Alışıldık anlamda controller, model ve view'ları vardır; artı ona özgü iki parça: verinin değişmesinin tek yolu olan *operation*'lar ve çekirdeğin dışındaki herkesin sürece katılma biçimi olan *kancalar*.

Bir özelliği okumak genellikle dört dosya okumak demektir: adrese cevap veren controller, satırları getiren model, onları görünüme çeviren şablon ve onları değiştiren operation trait'i. Bu biçim tanıdık olduğunda kod tabanı büyük olmaktan çıkıp tekrarlı olmaya başlar; amaç da budur.

## Yapı

### İstek Akışı

```bash
index.php
  └─ bootstrap.php   sabitler, otomatik yükleyici, yapılandırma, oturum, dil
      └─ Bootstrap::run()   adres -> rota -> controller dosyası + parametreler
          └─ {controller}->index(), index() yoksa ->main()
              ├─ istek `operation` taşıyorsa  -> operation metodu -> JSON
              └─ diğer her şey                -> page_{ad}()      -> HTML
```

Hatırlanacak şey ortadaki çataldır. Operation adı HTTP metodundan değil isteğin kendisinden okunur, yani her iki metot da taşıyabilir. Kararın söylediği şey hiçbir görünüm üretilmeyeceğidir. Bir operation adlandıran istek asla sayfa üretmez ve bir sayfa metodu asla yazmaz. Bu ayrım, izinleri, demo modunu ve hata biçimini her ekranda ayrı ayrı değil tek bir yerde karara bağlanabilir kılar.

### Katmanlar

- **Router**: Bir adresi controller ve parametrelerine çevirir. Rotalar dile göre çevrilir, yani aynı sayfanın her dilde farklı bir yolu vardır.
- **Controllers**: Her controller'ın türediği taban. Eşleşen modeli yükler, view'ı sunar, bir şablonun alacağı veriyi toplar ve operation'ları dağıtır.
- **Models**: Her modelin türediği taban. Veritabanı erişimi burada yaşar, üstünde hiçbir yerde değil.
- **View**: Şablon dizinini seçer ve toplanan veriyle bir şablondan çıktıyı üretir.
- **Operation**: Operation metoduna verilen nesne. Demo koruması, kanca yardımcısı ve JSON yanıtı onun üzerindedir.
- **Hook**: Genişletme noktası. Modüller, temalar ve kurulum seviyesindeki kurallar buraya bağlanır.

### Üç Taraf, Tek Uygulama

Yönetim paneli, müşteri panelini de içeren kamuya açık site ve zamanlanmış komut satırı aynı çekirdek üzerinde çalışır. Farkları hangi controller'ların cevap verdiği, hangi şablonların kullanıldığı ve hangi oturumun geçerli olduğudur. Biri için yazılan bir yardımcı diğerlerine de açıktır; iş kurallarının controller'da değil yardımcılarda durmasının sebebi budur.

## Tuzaklar

> **Admin ve müşteri tarafları ayrı kod yollarıdır**
> 
> Çoğu zaman aynı işi farklı dosyalarla yaparlar, yani birinde yapılan değişiklik diğerinde kendiliğinden doğru olmaz. Bir davranışı düzeltirken ikizinin başka bir yerde olup olmadığını kontrol edin.

> **Sorguların yeri modeldir**
> 
> Controller'a ya da şablona yazılan bir sorgu çalışır, sonra o sayfanın yeniden kullanılamamasının, önbelleklenememesinin ya da komut satırından çağrılamamasının sebebi olur. Tek satır bile olsa modele koyun.

## İlgili Makaleler

- [Bootstrap ve Otomatik Yükleme](https://dev.wisecp.com/tr/bootstrap-ve-otomatik-yukleme)
- [Controller ve Yönlendirme](https://dev.wisecp.com/tr/controller-ve-yonlendirme)
- [Model Katmanı](https://dev.wisecp.com/tr/model-katmani)
- [Operation'lar](https://dev.wisecp.com/tr/operationlar)
- [Kancalar Nasıl Çalışır](https://dev.wisecp.com/tr/kancalar-nasil-calisir)
