Gereksinimler ve Ön Hazırlık
Kendi framework'ünüzü oluşturmaya başlamadan önce, geliştirme ortamınızın modern standartlara uygun olduğundan emin olmalısınız. 2026 yılı standartlarında PHP 8.3 veya üzeri bir sürüm kullanmanız, tip güvenliği (type hinting) ve performans iyileştirmelerinden faydalanmanızı sağlar.
- PHP 8.3+: Modern sözdizimi ve performans için gereklidir.
- Composer: Otomatik yükleme (autoloading) işlemleri için zorunludur.
- Web Sunucusu: Apache veya Nginx üzerinde URL yönlendirme (mod_rewrite) aktif olmalıdır.
- Veritabanı: MySQL veya MariaDB, veri kalıcılığı için kullanılacaktır.
Projenizi başlatmak için bir klasör oluşturun ve terminalde composer init komutunu çalıştırarak composer.json dosyanızı oluşturun. Bu dosya, sınıflarınızın otomatik olarak yüklenmesini sağlayacak olan PSR-4 standartlarını tanımlamanıza olanak tanır.
Proje Yapısının Kurulması (Dizin Mimarisi)
MVC mimarisinin temel taşı, dosya sisteminin düzenli olmasıdır. "Public" dizini, dış dünyaya açık olan tek klasördür; diğer tüm dosyalar sunucunun kök dizininden erişilemez olmalıdır. Bu, güvenlik için kritik bir adımdır.
/app
/Controllers
/Models
/Views
/public
index.php
.htaccess
/vendor
composer.json
Yukarıdaki yapı, projenin temel iskeletidir. public/index.php dosyası, uygulamanın giriş noktasıdır (Front Controller). Tüm istekler buraya yönlendirilir ve buradan ilgili kontrolcüye aktarılır.
Yönlendirme (Routing) Mekanizması
Yönlendirme, gelen URL'leri alıp hangi kontrolcünün hangi metodunu çalıştıracağını belirleyen bir köprüdür. Basit bir router sınıfı oluşturarak, URL desenlerini (pattern) tanımlayabiliriz.
class Router {
protected array $routes = [];
public function add(string $uri, string $controller, string $action): void {
$this->routes[$uri] = ['controller' => $controller, 'action' => $action];
}
public function dispatch(string $uri): void {
if (array_key_exists($uri, $this->routes)) {
$route = $this->routes[$uri];
$controllerName = $route['controller'];
$action = $route['action'];
$controller = new $controllerName();
$controller->$action();
} else {
echo "404 Sayfa Bulunamadı";
}
}
}
Bu kod bloğu, basit bir yönlendirme mantığını temsil eder. add metodu ile rotaları kaydederiz, dispatch metodu ile ise gelen isteği işleriz. Gerçek projelerde bu yapıya regex desteği eklemek daha esnek sonuçlar verecektir.
Model-View-Controller Bileşenlerinin Oluşturulması
MVC'nin üç ana sütununu tanımlayalım. Model, veritabanı işlemlerini; View, kullanıcıya gösterilen HTML çıktısını; Controller ise bu ikisi arasındaki trafik akışını yönetir.
// Controller Örneği
class HomeController {
public function index() {
$data = ["baslik" => "Ana Sayfa"];
require_once '../app/Views/home.php';
}
}
Controller, veriyi alır ve View dosyasına gönderir. View dosyası ise sadece veriyi ekrana basmakla sorumludur. Bu ayrım, kodun bakımını kolaylaştırır ve "Spagetti Kod" oluşumunu engeller.
Veritabanı Bağlantısı ve Güvenlik
Veritabanı işlemleri için PDO (PHP Data Objects) kullanmak, SQL Injection saldırılarına karşı en temel savunma hattınızdır. Asla ham SQL sorgularını birleştirerek (concatenation) çalıştırmayın.
class Database {
private static ?PDO $instance = null;
public static function getConnection(): PDO {
if (self::$instance === null) {
self::$instance = new PDO('mysql:host=localhost;dbname=test', 'root', '');
self::$instance->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
return self::$instance;
}
}
Yukarıdaki Singleton deseni, uygulama boyunca tek bir veritabanı bağlantısı kullanılmasını sağlar. Bu, kaynak yönetimi açısından oldukça verimlidir. Güvenlik için her zaman prepare ve execute yöntemlerini kullanarak verileri filtreleyin.
Kritik Uyarı: Üretim ortamında (production) veritabanı şifrelerini kodun içine yazmayın. Mutlaka
.envdosyaları kullanarak çevresel değişkenler üzerinden yönetin ve bu dosyaları asla Git deposuna yüklemeyin.
MVC Mimarisi Karşılaştırmalı Analiz
Özel bir framework ile hazır framework'leri kullanmanın farklarını anlamak, mimari kararlarınızda size yardımcı olacaktır.
| Özellik | Özel Framework | Hazır Framework (örn. Laravel) |
|---|---|---|
| Öğrenme Eğrisi | Çok Yüksek | Orta |
| Performans | Maksimum (Gereksiz kod yok) | Düşük-Orta (Ekstra katmanlar) |
| Bakım | Zor (Dokümantasyon gerektirir) | Kolay (Standart dokümantasyon) |
Sıkça Sorulan Sorular
Kendi framework'ümü yapmam güvenli mi?
Doğru güvenlik pratiklerini (PDO, CSRF koruması, XSS filtreleme) uygularsanız oldukça güvenlidir. Ancak, büyük kurumsal projelerde güvenlik yamaları sürekli güncellenen hazır framework'ler daha güvenli kabul edilir.
Neden MVC kullanmalıyım?
MVC, kodunuzu parçalara ayırır. Bir tasarım değişikliği yaparken veritabanı kodlarınıza dokunmanıza gerek kalmaz, bu da geliştirme hızını artırır.
Performance kaybı olur mu?
Özel bir framework, sadece ihtiyacınız olan kodları barındırdığı için genellikle hazır framework'lerden daha hızlı çalışır.
Composer kullanmak zorunda mıyım?
Zorunlu değildir ancak profesyonel bir standart olan PSR-4 autoloading'i kullanmak için Composer en iyi araçtır.
Framework'ü nasıl test edebilirim?
PHPUnit kullanarak yazdığınız her sınıf için birim testleri (unit tests) yazarak framework'ünüzün kararlılığını test edebilirsiniz.
Sorumluluk Reddi: Bu makalede paylaşılan kod örnekleri eğitim amaçlıdır. Canlıya alacağınız projelerde XSS, CSRF ve SQL Injection gibi güvenlik açıklarına karşı ek kütüphaneler kullanmanız ve güvenlik denetimlerinden geçmeniz önemle tavsiye edilir.
Hata Ayıklama (Debugging) ve Hata Yönetimi
Kendi framework'ünüzü geliştirirken karşılaşılan en büyük zorluklardan biri, hataları kullanıcıya göstermeden geliştiriciye anlamlı bir şekilde sunmaktır. Profesyonel bir yapı için, PHP'nin hata yakalama mekanizmalarını özelleştirerek bir ErrorHandler sınıfı oluşturmalısınız.
Aşağıdaki örnek, hataları bir dosyaya loglayan ve geliştirme aşamasında ekrana detaylı bilgi veren basit bir yapı sunar:
class ErrorHandler {
public static function register() {
set_error_handler([self::class, 'errorHandler']);
set_exception_handler([self::class, 'exceptionHandler']);
}
public static function errorHandler($level, $message, $file, $line) {
throw new ErrorException($message, 0, $level, $file, $line);
}
public static function exceptionHandler($exception) {
$code = $exception->getCode();
if ($code != 404) $code = 500;
http_response_code($code);
echo "
Hata Oluştu
";
echo "Mesaj: " . $exception->getMessage() . "
";
// Geliştirme ortamında dosya ve satır bilgisini göster
if (getenv('APP_DEBUG') === 'true') {
echo "" . $exception->getTraceAsString() . "
";
}
}
}
Deployment ve Üretim Ortamı Optimizasyonu
Framework'ünüzü yerel bilgisayarınızdan canlı bir sunucuya taşırken dikkat etmeniz gereken kritik noktalar vardır. Özellikle performans ve güvenlik, canlı ortamda önceliklidir.
- OPcache Kullanımı: PHP'nin derlenmiş scriptleri bellekte tutmasını sağlayarak hızınızı ciddi oranda artırır.
- Dosya İzinleri:
storage/veyalogs/dizinlerinin web sunucusu tarafından yazılabilir olduğundan, ancak diğer dizinlerin (özellikleconfig/) dışarıdan erişilemez olduğundan emin olun. - Environment Değişkenleri: Veritabanı şifreleri ve API anahtarları gibi hassas bilgileri asla kod içerisinde tutmayın. Bunun yerine
.envdosyaları kullanın.
Canlı ortamda performansı artırmak için yönlendirme (routing) tablonuzu önbelleğe almayı düşünebilirsiniz. Her istekte tüm rotaları dosyadan okumak yerine, bir kez derlenmiş bir dizi (array) yapısı kullanmak CPU kullanımını düşürür:
// Cache örneği: rotaları bir dosyaya serialize ederek yazın
$routes = ['/' => 'HomeController@index', '/user' => 'UserController@show'];
file_put_contents('cache/routes.php', '
Sonuç
PHP ile MVC mimarisi kullanarak özel bir framework inşa etmek, bir yazılımcının "kaputun altında" neler döndüğünü anlaması için en iyi egzersizdir. Bu yolculuk boyunca yönlendirme, veritabanı yönetimi ve kod organizasyonu gibi temel becerileri pekiştirdiniz. Bir sonraki adım olarak, kendi framework'ünüze bir "Template Engine" (örneğin Twig benzeri) entegre etmeyi deneyebilir veya bir "Dependency Injection Container" yapısı kurarak sınıflar arası bağımlılıkları yönetmeyi öğrenebilirsiniz. İyi kodlamalar!


Yorumlar (0)
Yorum Yaz