PHP shablon va MVC tuzilishi

Loyiha o’sgani sayin bitta faylda SQL, validatsiya va HTML aralashib ketadi. MVC — bu chalkashlikni tartibga soladigan eng keng tarqalgan naqsh.

Muammo

<?php
// index.php — hamma narsa bir joyda
$pdo = new PDO("mysql:host=localhost;dbname=blog", "root", "");
$s = $pdo->query("SELECT * FROM maqolalar ORDER BY sana DESC");
$maqolalar = $s->fetchAll();
?>
<!DOCTYPE html>
<html>
<body>
  <?php foreach ($maqolalar as $m): ?>
    <h2><?= htmlspecialchars($m["sarlavha"]) ?></h2>
  <?php endforeach; ?>
</body>
</html>

Kichik sahifa uchun mayli. Lekin 20 sahifa bo’lsa: SQL takrorlanadi, dizayn o’zgarsa 20 faylni tahrirlaysiz, sinash imkonsiz.

MVC nima

Shablon funksiyasi

Avval eng oddiy qadam — HTML’ni funksiyaga o’rash:

PHP

Haqiqiy loyihada eval o’rniga fayl ishlatiladi:

<?php
function korinish(string $fayl, array $malumot = []): string
{
    extract($malumot);

    ob_start();
    require __DIR__ . "/korinishlar/{$fayl}.php";
    return ob_get_clean();
}

echo korinish("maqola", ["sarlavha" => "Salom", "matn" => "..."]);

ob_start() chiqishni buferga yig’adi, ob_get_clean() uni matn qilib qaytaradi — shu tufayli natijani qaytarish va layout ichiga qo’yish mumkin.

Layout

Sarlavha va footer har sahifada takrorlanmasin:

PHP

Endi dizayn bir joyda — o’zgartirish barcha sahifaga tarqaladi.

Model qatlami

Ma’lumot bilan ishlash — HTML’siz:

PHP

Bu klassda birorta HTML yo’q — shuning uchun uni alohida sinash mumkin va u API’da ham, veb-sahifada ham ishlatiladi.

Controller qatlami

Model va ko’rinishni bog’laydi:

PHP

Nazoratchi qaror qabul qiladi (topildimi, qaysi ko’rinish), lekin SQL ham, murakkab HTML ham yozmaydi.

Router

Manzilni nazoratchiga bog’laydi:

PHP

Bu — freymvorklardagi marshrutlashning soddalashtirilgan mohiyati.

To’liq tuzilma

loyiha/
├── public/
│   ├── index.php          ← yagona kirish nuqtasi
│   └── .htaccess          ← barcha so'rovni index.php ga
├── src/
│   ├── Model/
│   │   └── Maqola.php
│   ├── Nazoratchi/
│   │   └── MaqolaNazoratchisi.php
│   └── Router.php
├── korinishlar/
│   ├── layout.php
│   └── maqola/
│       ├── royxat.php
│       └── bittasi.php
├── .env
└── composer.json

public/index.php:

<?php
declare(strict_types=1);

require __DIR__ . "/../vendor/autoload.php";

use App\Router;
use App\Model\Maqola;
use App\Nazoratchi\MaqolaNazoratchisi;

$pdo = new PDO(/* ... */);
$nazoratchi = new MaqolaNazoratchisi(new Maqola($pdo));

$router = new Router();
$router->get("/", [$nazoratchi, "royxat"]);
$router->get("/maqola/{id}", [$nazoratchi, "bittasi"]);

echo $router->ishla(
    $_SERVER["REQUEST_METHOD"],
    parse_url($_SERVER["REQUEST_URI"], PHP_URL_PATH)
);

public/.htaccess (Apache uchun):

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ index.php [QSA,L]

Ko’rinishda mantiq bo’lmasin

Freymvorklar

Yuqoridagilarni qo’lda yozish — o’rganish uchun foydali. Amalda tayyor freymvork olinadi:

Freymvork Xususiyati
Laravel Eng mashhur, “batteries included”, katta hamjamiyat
Symfony Modulli, korporativ loyihalar, komponentlari alohida ishlatiladi
Slim Mikro — faqat router va middleware, API uchun

Ular router, shablon (Blade/Twig), ORM, validatsiya va xavfsizlikni tayyor beradi. Lekin ichida aynan shu naqshlar ishlaydi — shuning uchun ularni tushunish muhim.

Amaliy mashq

  1. korinish() funksiyasini yozib, shablonni faylga ajrating;
  2. layout() bilan sarlavha va footer’ni umumiy qiling;
  3. HTML’siz model klassi yozing;
  4. nazoratchi orqali model va ko’rinishni bog’lang;
  5. oddiy router yozib, uch manzilni bog’lang;
  6. mavjud bo’lmagan manzil uchun 404 qaytaring.

Qisqacha xulosa

  • MVC: model (ma’lumot), ko’rinish (HTML), nazoratchi (bog’lovchi).
  • Model HTML bilmaydi, ko’rinish SQL bilmaydi.
  • ob_start/ob_get_clean shablon natijasini matn qilib qaytaradi.
  • Layout dizaynni bir joyda saqlaydi.
  • Router manzilni nazoratchiga bog’laydi.
  • Yagona kirish nuqtasi (public/index.php) — sozlama bir marta.
  • Ko’rinishda mantiq bo’lmasin; har chiqishda htmlspecialchars.

Keyingi darsda testlash — kodni avtomatik tekshirish.

Bu dars foydali bo'ldimi?

marta ko'rildi