Yeni Başlayanlar İçin PHP’de MVC

Nedir bu MVC? Neden ihtiyaç duyulur? Nasıl ve nerelerde kullanılır? gibi birçok soru var kafada. Hele ki yeni bir PHP meraklısıysanız, bu sorular daha çok ve derinden gelir.

Ben, programlamayı vakit geçirmek için kullanan, ortaya bir şeyler çıkarmaya çalışan birisi olarak PHP ile makarna kod yazdığım zamanların ardından MVC ile tanıştım. Tanıştıktan sonra, bir daha görüşmedim çünkü yeterli türkçe kaynak yoktu/bulamamıştım ve tam manasıyla kavrayamamıştım. Buna istinaden şimdi aynı şekilde, bildiğim kadarıyla MVC’yi tarif edeceğim ve birkaç örnek vereceğim. Tariflerim hakkında bilgi alabilmek için, PHP’de biraz olsun OOP yani nesne yönelimli programlama bilginizin olması gerekiyor. Olmasa bile biraz zorlamanızı öneririm.

MVC, Model-View-Controller üçlüsünün baş harfleridir ve bunlar birer katmandır. Katman başka yerlere götürmesin sizi. Üç tane PHP dosyasının birleşimi gibi düşünebilirsiniz. Bu üç PHP dosyası ayrı işlemler yaparak, bizim işimizi kolaylaştırır. Model katmanı, veritabanından verileri çekmemizde bize yardımcı olur. Böylelikle verileri tek bir yerden kontrol etmiş oluruz. View katmanı, görünüm katmanıdır. Yani HTML, CSS, JavaScript gibi kodlarımızı tuttuğumuz katmandır. Controller katmanı ise sistemi kontrol ettiğimiz katmandır. Model katmanından verileri alır, View dosyasına göndeririz, View katmanında verileri listeledikten sonra kullanıcıya View dosyasını sunarız.

Bu yazı ve sonraki yazılarda basit bir MVC sistemi yazacağız. Bu sistemi kodlarken, üzerine basit bir blog sistemi de ekleyeceğiz. Her şeyi en basitinden vurgulayarak anlatacağım bu basit uygulamada, her satırın açıklamasını da yapmaya çalışacağım. Böylelikle ne yapmış olduğumuzu anlayabileceğiz. Sınıf ve metod isimlendirmelerinde Türkçe yerine İngilizce kullanacağım. Böyle yapmamın sebebi, MVC’yi anlamlandırırken İngilizce olarak anlamlandırmamızın daha sonrası için yararlı olacağı.

Yapacaklarımız:

  1. Çekirdek dizininde app sınıfının oluşturulması
    Yani, sistemin bel kemiğini ana klasörde yazacağız.
  2. Çekirdek dizininde model, view ve controller sınıflarının oluşturulması
    Yani, ana klasörde, veri, görünüm ve kontrol işlemlerini yapan kodları yazacağız.
  3. Models dizininde yeni bir model üzerinde çalışmak
    Yani, verileri yöneteceğimiz PHP kodlarında, örnek bir dosya oluşturacağız.
  4. Controllers dizininde yeni bir controller dosyası
    Yani, yeni bir kontrol dosyası oluşturup, adres barındaki URL’ye göre cevap vereceğiz.
  5. Views dizininde görünüm dosyaları yaratmak ve kullanmak
    Yani, kullanıcıların ne göreceğini, CSS ve JavaScript ayarlamalarını yapacağız.

Kabaca bu şekilde.

Projenin/uygulamanın bitmiş ve çalışır halinin deposuna buradan
İndirmek içinse buradan alalım sizi.

Önümüzdeki yazılarda görüşmek üzere.

Yazı dizisi:

  1. Yeni Başlayanlar İçin PHP’de MVC (Şu an buradasınız)
  2. MVC Uygulaması İçin İlk Adımlar: App Sınıfı
  3. MVC’de Giriş Sayfası, Ayarlamalar ve İlk Controller
  4. Controller ve View Çekirdek Sınıflarını Oluşturmak
  5. Model Katmanı ve Veritabanı İşlemlerini Kolaylaştırmak
  6. Proje/Uygulamanın Deposu
  7. Uygulamanın bitmiş halini indirin
  • Misafir

    MVC yapısını anlamaya, öğrenmeye çalışıyorum. Yalnız şu konuyu çözemedim:

    Tek bir kontroller ile şu 3 url şemasını nasıl kontrol edeceğim?

    http://www.adres.com/makaleler/ -> ana kategori

    http://www.adres.com/makaleler/1/ sayfalama urlsi

    http://www.adres.com/makaleler/notebook-satislari-azaldi/ -> makale detay urlsi

    Bu 3 url’yi tek controllerden harekete geçirmek mümkün mü? Değilse, her biri için ayrı kontroller mi oluşturacağım? Ama bu da mantıksız geliyor, o zaman kategori sayısınca php dosyası oluşturmak lazım ve bu da makarna gibi olacak :)

    • Bu sistemde ancak şu şekilde yapabilirsin:
      foo.com/makaleler > makalelerController:indexAction
      veya foo.com/makaleler/index
      foo.com/makaleler/goster/1 > makalelerController:gosterAction($id)
      foo.com/makaleler/goster/notebook-satisi-azaldi > makalelerController:gosterAction($slug)

      Daha spesifik bir URL adreslendirme için rotalayıcıya ihtiyacımız var (Router).

  • Misafir

    View html yerine json veya xml döndürebilir mi? Nasıl olur? Bir örnek rica ediyorum.

    • Merhaba,
      JSON için:
      header('Content-Type: application/json');
      echo json_encode(['status' => 200, 'data' => []]);

      XML için “php array to xml” aratarak örnekleri bulabilirsiniz. Farklı yöntemler var bunun için.