PHP MVC Mimarisi

MVC, web geliştirmedeki en önemli mimari modellerden biridir. Veritabanı sorgularını, HTML'yu, doğrulamayı ve iş mantığını aynı dosyada karıştırmak yerine geliştiricilerin kodu net katmanlar halinde düzenlemesine yardımcı olur.

PHP’de MVC, Laravel, Symfony, CodeIgniter gibi modern çerçevelerde ve birçok özel uygulamada yaygın olarak kullanılır. MVC'yu anlamak, geliştiricilerin daha temiz, bakımı daha kolay ve daha ölçeklenebilir PHP projeleri yazmasına yardımcı olur.

Bu makalede, MVC’nin anlamı, modeller, görünümler, denetleyiciler, yönlendirme, klasör yapısı, veritabanı katmanı, istek işleme, doğrulama ve MVC’nin gerçek PHP uygulamalarında nasıl çalıştığı dahil olmak üzere PHP MVC mimarisini ayrıntılı olarak açıklanmaktadır.

MVC Nedir?

MVC anlamına gelirModeli,GörüntüleveDenetleyici. Bir uygulamayı üç ana parçaya ayıran bir yazılım mimarisi modelidir.

  • Modeli:verileri, veritabanı işlemlerini ve iş kurallarını yönetir.

  • Görünüm:kullanıcı arayüzünü yönetir ve HTML çıktısını görüntüler.

  • Denetleyici:istekleri alır, mantığı koordine eder ve yanıtları döndürür.

MVC’nin temel amacı kaygıların ayrılmasıdır. Her parçanın belirli bir sorumluluğu vardır. Bu, projenin anlaşılmasını, test edilmesini, sürdürülmesini ve genişletilmesini kolaylaştırır.

MVC olmadan, bir PHP dosyası HTML, SQL sorguları, doğrulama, yönlendirmeler, oturum kontrolleri ve iş mantığını bir arada içerebilir. Bu, küçük komut dosyaları için işe yarayabilir ancak proje büyüdükçe yönetilmesi zorlaşır.

MVC, PHP’de Neden Önemlidir?

PHP esnektir ve geliştiricilerin birçok yolla kod yazmasına olanak tanır. Yeni başlayanlar genellikle PHP’yi doğrudan HTML dosyalarının içine yazarak başlarlar. Bu, temel sözdizimini öğrenmek için iyidir, ancak daha büyük uygulamaların daha iyi organizasyona ihtiyacı vardır.

MVC önemlidir çünkü büyüyen PHP projelerinde sık karşılaşılan sorunların çözülmesine yardımcı olur:

  • Veritabanı mantığını HTML çıkışından ayırır.

  • İstek işlemeyi denetleyicilerin içinde tutar.

  • Görünümleri daha net hale getirir ve düzenlenmesini kolaylaştırır.

  • Tekrarlanan kodları azaltır.

  • Sürdürülebilirliği artırır.

  • Projenin ölçeklendirilmesini kolaylaştırır.

  • Geliştiricileri Laravel ve Symfony gibi çerçevelere hazırlar.

Bir proje MVC'yu takip ettiğinde geliştiriciler farklı parçalar üzerinde daha kolay çalışabilir. Örneğin, bir geliştirici görünüm tasarımını güncellerken başka bir geliştirici veritabanı mantığı üzerinde çalışabilir.

PHP MVC'daki model

Model, verilerden ve iş kurallarından sorumludur. Bir PHP uygulamasında modeller genellikle PDO, sorgu oluşturucular veya ORM araçlarını kullanarak veritabanıyla iletişim kurar.

Örneğin bir blog uygulamasındaGönderimodel, gönderi almaktan, bir gönderi bulmaktan, yeni bir gönderi oluşturmaktan, bir gönderiyi güncellemekten ve bir gönderiyi silmekten sorumlu olabilir.

<?php
class Post
{
    private PDO $pdo;

    public function __construct(PDO $pdo)
    {
        $this->pdo = $pdo;
    }

    public function all(): array
    {
        $statement = $this->pdo->query("
            SELECT id, title, content, created_at
            FROM posts
            ORDER BY id DESC
        ");

        return $statement->fetchAll(PDO::FETCH_ASSOC);
    }

    public function find(int $id): ?array
    {
        $statement = $this->pdo->prepare("
            SELECT id, title, content, created_at
            FROM posts
            WHERE id = :id
            LIMIT 1
        ");

        $statement->execute([
            "id" => $id
        ]);

        $post = $statement->fetch(PDO::FETCH_ASSOC);

        return $post ?: null;
    }
}
?>

Bu model yalnızca veri işlemlerine odaklanır. HTML'yu yazdırmaz ve sayfa düzenini doğrudan kontrol etmez.

Daha büyük uygulamalarda modeller aynı zamanda ilişkileri, doğrulama kurallarını, iş yöntemlerini ve etki alanı mantığını da içerebilir. Laravel gibi çerçevelerde modeller genellikle Eloquent adı verilen bir ORM aracılığıyla veritabanı tablolarına bağlanır.

PHP MVC'da görüntüle

Görünüm, kullanıcıya veri görüntülemekten sorumludur. Genellikle değişkenleri, döngüleri ve koşulları yazdırmak için küçük PHP ifadelerini içeren HTML içerir.

Örneğin, gönderilerin listesini görüntüleyen bir görünüm dosyası şöyle görünebilir:

<h1>Blog Posts</h1>

<?php foreach ($posts as $post): ?>
    <article>
        <h2><?php echo htmlspecialchars($post["title"], ENT_QUOTES, "UTF-8"); ?></h2>
        <p><?php echo htmlspecialchars($post["content"], ENT_QUOTES, "UTF-8"); ?></p>
    </article>
<?php endforeach; ?>

Görünüm sunuma odaklanmalıdır. Veritabanı sorguları veya karmaşık iş mantığı içermemelidir.

Görünümler faydalıdır çünkü tasarımcılar ve ön uç geliştiriciler, veritabanı katmanının her ayrıntısını anlamalarına gerek kalmadan HTML yapısıyla çalışabilirler.

Laravel'da görünümler genellikle Blade şablonları kullanılarak yazılır. Saf PHP MVC'da normal PHP dosyaları şablon olarak kullanılabilir.

PHP MVC'daki denetleyici

Denetleyici isteği alır, gerekli model yöntemlerini çağırır, verileri hazırlar ve doğru görünümü yükler.

Örneğin, birPostKontrolcübir gönderi listesini göstermeyi ve tek bir gönderi göstermeyi işleyebilir.

<?php
class PostController
{
    private Post $postModel;

    public function __construct(Post $postModel)
    {
        $this->postModel = $postModel;
    }

    public function index(): void
    {
        $posts = $this->postModel->all();

        require __DIR__ . "/../views/posts/index.php";
    }

    public function show(int $id): void
    {
        $post = $this->postModel->find($id);

        if (!$post) {
            http_response_code(404);
            echo "Post not found.";
            return;
        }

        require __DIR__ . "/../views/posts/show.php";
    }
}
?>

Bu örnekte denetleyici doğrudan SQL yazmıyor. Modelden veri ister ve ardından bu veriyi görünüme gönderir.

Denetleyiciler uygulama davranışını düzenlemek için kullanışlıdır. Form gönderimlerini, yönlendirmeleri, doğrulamayı, kimlik doğrulama kontrollerini ve API yanıtlarını yönetebilirler.

PHP MVC'da Yönlendirme

Yönlendirme, URL'leri denetleyici yöntemlerine bağlar. Uygulama, her PHP dosyasının doğrudan tarayıcı tarafından açılması yerine, istekleri merkezi bir giriş noktası aracılığıyla yönlendirebilir.

Örneğin:

  • /gönderilerarayabilirimPostController@index.

  • /posts/show?id=5arayabilirimPostController@gösteri.

  • /yayınlar/oluşturarayabilirimPostController@create.

  • /yayınlar/mağazaarayabilirimPostController@mağaza.

İstek URI'si kullanılarak çok basit bir yönlendirici yazılabilir.

<?php
$uri = parse_url($_SERVER["REQUEST_URI"], PHP_URL_PATH);

if ($uri === "/posts") {
    $controller->index();
} elseif ($uri === "/posts/show") {
    $id = (int) ($_GET["id"] ?? 0);
    $controller->show($id);
} else {
    http_response_code(404);
    echo "Page not found.";
}
?>

Bu temel bir yönlendirme örneğidir. Gerçek yönlendiriciler daha gelişmiştir ve rota parametrelerini, HTTP yöntemlerini, ara yazılımları, adlandırılmış rotaları ve gruplandırılmış rotaları işleyebilir.

Laravel gibi çerçeveler güçlü yönlendirme sistemleri sağlar ancak basit bir yönlendiriciyi anlamak, perde arkasında neler olduğunu anlamanıza yardımcı olur.

Ön Denetleyici Deseni

Birçok MVC uygulaması ön denetleyici modelini kullanır. Bu, tüm isteklerin uygulamaya genellikle tek bir ana dosya aracılığıyla girdiği anlamına gelir.public/index. php.

Ön denetleyici, yapılandırmanın yüklenmesinden, uygulamanın başlatılmasından, rotaların kaydedilmesinden ve isteğin doğru denetleyiciye gönderilmesinden sorumludur.

Temel bir ön denetleyici şöyle görünebilir:

<?php
require __DIR__ . "/../config/database.php";
require __DIR__ . "/../app/Models/Post.php";
require __DIR__ . "/../app/Controllers/PostController.php";

$postModel = new Post($pdo);
$controller = new PostController($postModel);

$uri = parse_url($_SERVER["REQUEST_URI"], PHP_URL_PATH);

if ($uri === "/posts") {
    $controller->index();
} else {
    http_response_code(404);
    echo "Page not found.";
}
?>

Ön denetleyici, birçok dahili PHP dosyasını tarayıcıya göstermek yerine uygulamaya kontrollü bir giriş noktası sağlar.

Bu yapı modern çerçevelerde yaygındır. Laravel, Symfony ve diğer birçok çerçeve, uygulamayı başlatan genel bir giriş noktası kullanır.

PHP MVC Klasör Yapısı

Basit bir PHP MVC projesi, modeller, görünümler, denetleyiciler, yapılandırma ve genel dosyalar için klasörler halinde düzenlenebilir.

project/
├── app/
│   ├── Controllers/
│   │   └── PostController.php
│   ├── Models/
│   │   └── Post.php
│   └── Views/
│       └── posts/
│           ├── index.php
│           └── show.php
├── config/
│   └── database.php
├── public/
│   └── index.php
└── routes/
    └── web.php

uygulamaklasör ana uygulama kodunu içerir.Kontrolörlerklasör istek işleme sınıflarını içerir.Modellerklasör veriyle ilgili sınıfları içerir.Görünümlerklasör şablonlar içerir.

yapılandırmaklasör, veritabanı bağlantı ayarları gibi yapılandırma dosyalarını saklar.kamuklasör, web üzerinden erişilebilen klasördür ve ana giriş noktasını içerir.

Bu yapı projenin düzenli kalmasını sağlar ve kullanıcıların dahili uygulama dosyalarına doğrudan erişmesini engeller.

MVC'da Veritabanı Katmanı

Veritabanı katmanı genellikle modeller veya depo sınıfları tarafından yönetilir. Görevi veritabanıyla iletişim kurmak ve verileri denetleyiciye geri göndermektir.

Bir veritabanı yapılandırma dosyası şöyle görünebilir:

<?php
$pdo = new PDO(
    "mysql:host=localhost;dbname=php_mvc;charset=utf8mb4",
    "root",
    ""
);

$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
?>

Model, prepared statements'yu çalıştırmak için bu PDO bağlantısını kullanabilir.

<?php
class User
{
    public function __construct(private PDO $pdo)
    {
    }

    public function findByEmail(string $email): ?array
    {
        $statement = $this->pdo->prepare("
            SELECT id, name, email
            FROM users
            WHERE email = :email
            LIMIT 1
        ");

        $statement->execute([
            "email" => $email
        ]);

        $user = $statement->fetch();

        return $user ?: null;
    }
}
?>

Veritabanı mantığını modellerin veya depoların içinde tutmak, denetleyicileri daha temiz ve okunması kolay hale getirir.

MVC'da İstek İşleme

İstek işleme, tarayıcıdan veya API istemcisinden girdi almak anlamına gelir. Bu giriş formlardan, sorgu dizelerinden, JSON isteklerinden, yüklenen dosyalardan, tanımlama bilgilerinden veya oturumlardan gelebilir.

MVC'da denetleyici genellikle istek verilerini alır ve bununla ne yapacağına karar verir.

<?php
class ContactController
{
    public function store(): void
    {
        $name = trim($_POST["name"] ?? "");
        $email = trim($_POST["email"] ?? "");
        $message = trim($_POST["message"] ?? "");

        if ($name === "" || !filter_var($email, FILTER_VALIDATE_EMAIL) || $message === "") {
            echo "Invalid contact form.";
            return;
        }

        echo "Message received.";
    }
}
?>

Daha büyük bir projede, istek doğrulaması ayrı bir doğrulayıcı sınıfına veya istek sınıfına taşınabilir. Bu, denetleyicilerin daha küçük ve daha odaklanmış olmasını sağlar.

Laravel gibi çerçeveler, bu süreci düzenlemek için istek sınıfları ve doğrulama kuralları sağlar.

MVC'da doğrulama

Doğrulama, giriş verilerinin kabul edilebilir olup olmadığını kontrol etme işlemidir. MVC uygulamalarında doğrulama denetleyicinin, modelin, hizmetin veya ayrı bir doğrulama sınıfının içinde gerçekleşebilir.

Basit projeler için kontrolörün içindeki doğrulama yeterli olabilir. Daha büyük projeler için doğrulamayı ayırmak kodu daha temiz hale getirir.

<?php
class PostValidator
{
    public function validate(array $data): array
    {
        $errors = [];

        $title = trim($data["title"] ?? "");
        $content = trim($data["content"] ?? "");

        if ($title === "") {
            $errors["title"] = "Title is required.";
        }

        if (strlen($title) > 200) {
            $errors["title"] = "Title must not exceed 200 characters.";
        }

        if ($content === "") {
            $errors["content"] = "Content is required.";
        }

        return $errors;
    }
}
?>

Denetleyici daha sonra doğrulayıcıyı kullanabilir:

<?php
$validator = new PostValidator();

$errors = $validator->validate($_POST);

if (count($errors) > 0) {
    require __DIR__ . "/../views/posts/create.php";
    return;
}
?>

Bu, doğrulama mantığının yeniden kullanılabilir olmasını ve test edilmesinin daha kolay olmasını sağlar.

Görünümleri Oluşturma

Görünüm oluşturmak, bir şablonu yüklemek ve ona veri aktarmak anlamına gelir. Saf PHP’de, kullanılarak basit bir görünüm oluşturucu oluşturulabilir.çıkarma()vegerektirir.

<?php
function view(string $path, array $data = []): void
{
    extract($data);

    require __DIR__ . "/../app/Views/" . $path . ".php";
}
?>

Denetleyici görünüm yardımcısını şu şekilde çağırabilir:

<?php
public function index(): void
{
    $posts = $this->postModel->all();

    view("posts/index", [
        "posts" => $posts
    ]);
}
?>

Daha sonra görünüm dosyası şuraya erişebilir:$gönderilerdeğişken.

<?php foreach ($posts as $post): ?>
    <h2><?php echo htmlspecialchars($post["title"], ENT_QUOTES, "UTF-8"); ?></h2>
<?php endforeach; ?>

Görünüm oluşturucu, şablonları yüklemek için tutarlı bir yol oluşturduğundan küçük ama kullanışlı bir gelişmedir.

PHP MVC'daki düzenler

Çoğu web sitesinde üst bilgi, gezinme ve alt bilgi gibi paylaşılan düzen bölümleri bulunur. MVC uygulamaları, her görünümde aynı HTML'nun tekrarlanmasını önlemek için sıklıkla düzenleri kullanır.

Basit bir düzen dosyası ana HTML yapısını içerebilir:

<!DOCTYPE html>
<html>
<head>
    <title><?php echo htmlspecialchars($title ?? "PHP MVC", ENT_QUOTES, "UTF-8"); ?></title>
</head>
<body>
    <header>
        <nav>
            <a href="/posts">Posts</a>
        </nav>
    </header>

    <main>
        <?php echo $content; ?>
    </main>

    <footer>
        <p>PHP MVC Application</p>
    </footer>
</body>
</html>

Daha gelişmiş şablon sistemleri, sayfa içeriğini mizanpaja enjekte etmek için çıktı arabelleğe almayı kullanır.

<?php
ob_start();

require __DIR__ . "/posts/index.php";

$content = ob_get_clean();

require __DIR__ . "/layout.php";
?>

Düzenler, arayüzün sayfalar arasında tutarlı kalmasına ve kopyalanan HTML'nun azaltılmasına yardımcı olur.

MVC ve CRUD

CRUD uygulamaları MVC'yu anlamanın iyi bir yoludur. Bir gönderiler modülü, gönderileri listelemek, oluşturmak, düzenlemek ve silmek için bir modele, denetleyiciye ve görünümlere sahip olabilir.

TemelPostKontrolcüaşağıdaki gibi yöntemler içerebilir:

  • indeks()Gönderileri listelemek için.

  • göster()Bir gönderiyi göstermek için.

  • yarat()Bir formu görüntülemek için.

  • mağaza()Yeni bir gönderi kaydetmek için.

  • düzenle()Bir düzenleme formunu görüntülemek için.

  • güncelleme()Bir gönderiyi güncellemek için.

  • yok et()Bir gönderiyi silmek için.

Model veritabanı işlemlerini yönetir, denetleyici isteği koordine eder ve görünüm formları ve verileri görüntüler.

Bu yapı, Laravel denetleyicilerinin ve kaynaklarının çalışma şekline çok benzer.

MVC ve REST API

MVC, REST APIs için de kullanılabilir. Bu durumda denetleyici, bir HTML görünümü yüklemek yerine JSON değerini döndürür.

<?php
class ApiPostController
{
    public function __construct(private Post $postModel)
    {
    }

    public function index(): void
    {
        header("Content-Type: application/json");

        echo json_encode([
            "success" => true,
            "data" => $this->postModel->all()
        ]);
    }
}
?>

API denetleyicileri için model hâlâ verileri işliyor ancak yanıt genellikle JSON oluyor. Bu, MVC'yu hem geleneksel sunucu tarafından oluşturulan web siteleri hem de API tabanlı uygulamalar için kullanışlı hale getirir.

Bir REST API MVC yapısı aşağıdaki gibi ayrı denetleyicilere sahip olabilir:PostApiController,UserApiControllerveAuthApiDenetleyici.

PHP MVC Mimarisinin Faydaları

MVC, PHP uygulamaları için çeşitli pratik avantajlar sağlar.

  • Temizleyici kodu:her bir parçanın açık bir sorumluluğu vardır.

  • Daha iyi organizasyon:dosyalar amaca göre gruplandırılmıştır.

  • Yeniden kullanılabilirlik:modeller ve hizmetler farklı denetleyicilerde yeniden kullanılabilir.

  • Sürdürülebilirlik:Mantık ayrıldığı için değişiklikler daha kolaydır.

  • Ölçeklenebilirlik:yapı projeyle birlikte büyüyebilir.

  • Ekip işbirliği:arka uç ve ön uç çalışmaları daha net bir şekilde ayrılabilir.

  • Çerçeve hazırlığı:MVC, geliştiricileri Laravel, Symfony ve benzer çerçevelere hazırlar.

Küçük komut dosyaları için MVC ekstra iş gibi görünebilir. Ancak büyüyecek uygulamalar için MVC, karmaşık kodun ve tekrarlanan mantığın önlenmesine yardımcı olur.

PHP MVC'da Yaygın Hatalar

Yeni başlayanlar bazen MVC'yu yanlış anlar ve kodu yanlış katmana yerleştirir. Bu, desenin faydalarını azaltabilir.

Yaygın hatalar şunları içerir:

  • SQL sorgularını doğrudan görünümlerin içine yazma.

  • Denetleyicilerin içine çok fazla iş mantığı koymak.

  • Modelleri yalnızca boş veri kapsayıcıları olarak kullanma.

  • HTML çıktısını modellerin içinde karıştırma.

  • Doğrulamayı atlamak veya tutarsız bir şekilde yerleştirmek.

  • Dahili uygulama dosyalarının kamuya açık hale getirilmesi.

  • Çok fazla sorumluluğu olan çok büyük denetleyiciler oluşturmak.

İyi bir MVC uygulaması, görünümlerin ekrana, denetleyicilerin istek akışına ve modellerin veri ve iş kurallarına odaklanmasını sağlar.

PHP MVC için Güvenlik Notları

MVC organizasyonu iyileştirir ancak bir uygulamayı otomatik olarak güvenli hale getirmez. Güvenliğin yine de her katmana uygulanması gerekiyor.

Önemli güvenlik uygulamaları şunları içerir:

  • Modellerde ve veritabanı katmanlarında prepared statements kullanın.

  • İstek verilerini kaydetmeden önce doğrulayın.

  • Görünümlerdeki çıkıştan kaçışhtmlspecialchars().

  • Formları CSRF belirteçleriyle koruyun.

  • Denetleyicilerde veya ara yazılımlarda kimlik doğrulamayı ve yetkilendirmeyi kontrol edin.

  • App, config veya yönlendirmeler gibi dahili klasörleri herkese açık şekilde göstermeyin.

  • Üretimdeki teknik hataları gizleyin.

  • Sırları genel dosyaların dışında saklayın.

Ortak bir güvenlik dostu yapı yalnızcakamuweb sunucusundan erişilebilen klasör. Diğer klasörler doğrudan genel erişimin dışında kalmalıdır.

Laravel'da MVC

Laravel, en popüler PHP çerçevelerinden biridir ve ağırlıklı olarak MVC kavramlarına dayanmaktadır. Laravel'da yollar istekleri alır, denetleyiciler mantığı yönetir, modeller veritabanıyla etkileşime girer ve Blade görünümleri kullanıcı arayüzünü görüntüler.

Laravel MVC örnekleri şunları içerir:

  • Rotalar:Routes/web. php veya Routes/api. php dosyasında tanımlıdır.

  • Kontrolörler:app/Http/Controllers'da saklanır.

  • Modeller:app/Models'da saklanır.

  • Görünümler:kaynaklarda/görünümlerde saklanır.

  • Doğrulama:istekler, denetleyiciler veya doğrulayıcılar tarafından işlenir.

  • Ara yazılım:kimlik doğrulama, CSRF ve izinler için kullanılır.

MVC'yu saf PHP’de öğrenmek, Laravel'nun anlaşılmasını kolaylaştırır çünkü çerçeve aynı genel fikirleri daha gelişmiş ve organize bir şekilde kullanır.

Basit MVC İstek Akışı

Tipik bir MVC istek akışı şuna benzer:

  1. Tarayıcı uygulamaya bir istek gönderir.

  2. Talep şu şekilde girer:public/index. php.

  3. Yönlendirici URL'yi ve HTTP yöntemini kontrol eder.

  4. Yönlendirici doğru denetleyici yöntemini çağırır.

  5. Denetleyici girişi doğrular ve modeli çağırır.

  6. Model, veritabanını kullanarak verileri okur veya yazar.

  7. Model verileri denetleyiciye döndürür.

  8. Denetleyici bir görünüm yükler veya JSON değerini döndürür.

  9. Yanıt tarayıcıya veya API istemcisine geri gönderilir.

Bu akış, uygulamayı düzenli tutar ve kodun her bir bölümünün nereye ait olduğunu anlamayı kolaylaştırır.

Sonuç

PHP MVC mimarisi, düzenli ve bakımı yapılabilir web uygulamaları oluşturmaya yönelik önemli bir kavramdır. MVC, uygulamayı modellere, görünümlere ve denetleyicilere ayırarak kodun daha temiz ve yönetilmesini kolaylaştırır.

Modeller verileri ve iş mantığını yönetir, görünümler sunumu yönetir ve denetleyiciler istek akışını yönetir. Yönlendirme, URL'leri denetleyici yöntemlerine bağlarken, ön denetleyici uygulama için tek bir giriş noktası sağlar.

PHP MVC mimarisini anladıktan sonraki adım, küçük bir MVC CRUD uygulaması oluşturarak pratik yapmak, ardından hizmetler, depolar, ara katman yazılımı, kimlik doğrulama, REST APIs, Composer otomatik yükleme ve Laravel geliştirme.