Bu yazıda MVC nedir, ne değildir, avantajları, tarihçesi vs. bahsetmeyeceğim. Web’de halihazırda teorik olarak tonlarca kaynak içeren bu tasarım mimarisinin, daha çok kaynak eksikliği olduğunu düşündüğüm “pratikte kullanılması” konusuna değineceğim.
Yine de MVC’yi basit bir şekilde özetlersek;

MVC, özellikle büyük çaplı projelerde tercih edilen, projenin yönetimini kolaylaştıran bir tasarım desenidir. Bu tasarım deseninde, proje Model, View ve Controller olmak üzere temelde üç parçaya ayrılır. Model kısmında, tüm veri tabanı işlemleri gerçekleştirilir. View kısmında, kullanıcının göreceği html dosyaları yer alır. Controller kısmı hem view ile hem de model ile etkileşime geçen ve modelden gelen bilgileri view’daki html’e entegre edip kullanıcıya sunan kısımdır. Projeyle ilgili tüm iş akışı kontrolleri controller’da gerçekleşir.
Şimdi teorik kısmı bitip pratiğe geçmeden önce mvc ile çalışan bir web sitesine istek gönderildiğinde nasıl bir senaryo gerçekleştiğine bakalım.
- Kullanıcıya web tarayıcısı ile “keremmert.app” adresine bir GET isteği gönderir.
- İstek sonucunda router dosyası çalışır. Router, isteği değerlendirir ve “keremmert.app” url’i ile ilişkili olan HomeController sınıfını dosyaya dahil eder.
- HomeController sınıfından bir nesne oluşturulur ve içerisindeki index metodu çağrılır.
- İndex metodu, ilgili HomeModel sınıfı ile sınıf içerisinde başka metotlar kullanarak iletişime geçer.
- HomeModel , veri tabanıyla etkileşim kurar ve controller’a içerik bilgilerini döndürür.
- Sonrasında index metodu içerisinde homeController ile ilişkili view’daki home.html dosyasına bilgiler parametre olarak gönderilir ve html dosyası geriye döndürülür.
Evet, anlatım biraz karmaşık gelmiş olabilir. Ama eminim basit bir proje ile daha iyi anlaşılacak.
Öyleyse projemizin dizin yapısını oluşturmayla başlayalım.
Proje dizinimiz en basit haliyle aşağıdaki gibi olmalı.

index.php routing işleminin gerçekleştiği yer, .htaccess sunucu yapılandırmalarının gerçekleştiği dosya, app/models Model dosyalarını içeren kısım, app/views view dosyalarını içeren kısım ve app/controllers controller dosyalarını içeren kısım olacak. Bu proje dizini ihtiyaca göre farklı bir şekilde de yapılandırılabilir. Bizim yapacağımız proje basit olacağından dolayı şimdilik daha fazla öğeye ihtiyacımız yok.
İlk olarak .htaccess dosyasını açalım ve aşağıdaki kodları yapıştıralım.
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^(.+)$ index.php?address=$1 [QSA,L]
#Dizin erişimi engelleme
Options -Indexes
Yapıştırdığımız kodları çok iyi bilmemize gerek yok. Sadece ne yaptığını bilmemiz yeterli. Bu kodlar sayesinde, herhangi bir url’ye istek geldiğinde index.php dosyası çalışacak ve girilen url’yi address parametresi olarak algılayacak. Örneğin, “keremmert.app/iletisim” sayfasına istek geldiğinde “address” değeri “iletisim” olacak.
Şimdi routing işlemini yapacağımız index.php sayfasına geçelim. URL isminde sitenin bulunacağı dizini tutan bir sabit tanımlayalım. İleride yönlendirme veya dosya dahil etmelerde bu sabiti kullanacağız. Sonrasında url parametresinin boş olup olmadığını kontrol edelim eğer boşsa “home” değerini address’e atayalım. adrress’i parse etmemiz gerekiyor. Örneğin “/yazilar/doga” adresine bir istek geldiğinde “yazilar” ve “doga” olarak ikiye ayırmalıyız. Bunun için explode(“/”, mb_strtolower(trim($_GET[“address”], “/”))); ifadesini kullandım. Bu kod “/” ifadelerini temizleyecek ve string’i bir diziye ayrıştıracak. Sonrasında ise switch case ile address’in 0. index’ini kontrol etmemiz gerekecek. Aşağıdaki kod address değeri home ise “hello world” yazacak değilse””Page is not found” mesajını verecek.
<?php
const URL = "/mvc/";
if(empty($_GET["address"])):
$_GET["address"] = "home";
endif;
$address = explode("/", mb_strtolower(trim($_GET["address"], "/")));
switch($address[0]):
case "home":
echo "hello world";
break;
default:
echo "Page is not found";
endswitch;
Böylece routing altyapımızı oluşturmuş olduk. Şimdi home sayfamız için bir app/controllers dizini altında homeController sınıfı oluşturalım.
<?php
class HomeController
{
public function index(): void
{
echo "hello world";
}
}
Home Controller dosyası içerisinde bir adet index metodu barındıran bir sınıf oluşturduk. Şimdi bu sınıfı index.php içerisinde /home adresine istek geldiğinde bu sınıftan bir nesne oluşacak ve içerisindeki index metodu çalışacak şekilde ayarlayalım.
Evet, şuana kadar her şey yolunda. Şimdi app/models dizini altına HomeModel sınıfı oluşturalım. Fakat ben direkt veri tabanıyla etkileşime geçmeyeceğim. Çünkü bu bir yığın kod anlamına geliyor. Sizden, verileri veri tabanında geliyormuş gibi düşünmenizi istiyorum.
<?php
class HomeModel
{
public function content(): string
{
$data = "I Am DATA!"; //Veritabından geldiğini düşünelim;
return $data;
}
}
Şimdi, HomeController’da HomeModel ile etkileşime geçip, verileri alalım ve ekrana yazdıralım.
<?php
require_once "app/models/HomeModel.php";
class HomeController
{
public HomeModel $homeModel;
public function index(): void
{
$this->homeModel = new HomeModel();
$data= $this->getContent();
echo $data;
}
public function getContent(): string
{
return $this->homeModel->content();
}
}
Evet, model kısmınıda tamamladık. Son olarak app/view altında home.php dosyasını oluşturalım. Ve biraz html yazalım.
<!doctype html>
<html lang="tr">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<h1>
<?php
echo $data;
?>
</h1>
</body>
</html>
HomeController’da index metodu içerisinde bu dosyayı çağıralım.
Önemli: Controller’ın içerisindeki index metodunda oluşturmuş olduğumuz $data değişkenini dahil ettiğimiz home.php dosyasında kullanabiliyoruz.
public function index(): void
{
$this->homeModel = new HomeModel();
$data = $this->getContent();
require_once "app/views/home.php";
}

Her ne kadar tasarım ve teknik olarak fakir olsa da MVC projemiz çalışıyor. 🙂
Projenin kodları: https://github.com/kerem37mert/php-mvc-skeleton
Ayrıca, MVC ile daha önce geliştirmiş olduğum projeyi de inceleyebilirsiniz: https://github.com/kerem37mert/dark-website-full