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:
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:
Endi dizayn bir joyda — o’zgartirish barcha sahifaga tarqaladi.
Model qatlami
Ma’lumot bilan ishlash — HTML’siz:
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:
Nazoratchi qaror qabul qiladi (topildimi, qaysi ko’rinish), lekin SQL ham, murakkab HTML ham yozmaydi.
Router
Manzilni nazoratchiga bog’laydi:
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
korinish()funksiyasini yozib, shablonni faylga ajrating;layout()bilan sarlavha va footer’ni umumiy qiling;- HTML’siz model klassi yozing;
- nazoratchi orqali model va ko’rinishni bog’lang;
- oddiy router yozib, uch manzilni bog’lang;
- 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_cleanshablon 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.