آموزش ساخت پروژه MVC با PHP خام به صورت گام به گام طبق استانداردهای روز
معماری MVC چیست و چرا باید از آن استفاده کنیم؟
در توسعه وبسایتها با PHP خام (Vanilla PHP)، پروژههای کوچک معمولاً بدون ساختار خاصی نوشته میشوند. کدهای HTML، کوئریهای SQL و منطق برنامه همگی در یک فایل مخلوط میشوند که به آن اصطلاحاً «کد اسپاگتی» میگویند. معماری MVC (Model-View-Controller) پاسخی به این بینظمی است و کمک میکند برنامه ما طبق استانداردهای توسعه مدرن به ۳ بخش کاملاً مجزا تفکیک شود.
- Model (مدل): مسئول مدیریت دادهها، منطق کسبوکار و ارتباط با پایگاه داده است.
- View (ویو): رابط کاربری و نحوه نمایش دادهها به کاربر را مدیریت میکند (کدهای HTML/CSS).
- Controller (کنترلر): واسط بین مدل و ویو است که درخواستهای کاربر را دریافت کرده، پردازش میکند و پاسخ مناسب را ارسال مینماید.
ساختار استاندارد پوشهبندی در پروژه PHP MVC
پیش از کدنویسی، باید یک ساختار فایل تمیز و ساختاریافته مطابق با استانداردهای گوگل ایجاد کنیم:
my-mvc-project/
├── app/
│ ├── Controllers/
│ │ └── UserController.php
│ ├── Models/
│ │ └── UserModel.php
│ ├── Views/
│ │ └── user_list.php
│ └── core/
│ ├── App.php
│ ├── Controller.php
│ └── Database.php
├── public/
│ ├── css/
│ ├── js/
│ └── index.php
└── .htaccess
گام اول: هدایت تمام درخواستها به فایل اصلی (.htaccess)
در پروژه استاندارد MVC، کاربر نباید مستقیماً به فایلهای مختلف دسترسی داشته باشد. ما از الگوی Front Controller استفاده میکنیم و تمام درخواستها را به فایل public/index.php هدایت میکنیم.
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ public/index.php?url=$1 [QSA,L]
گام دوم: طراحی سیستم روتینگ هوشمند (Routing)
کلاس App.php در هسته سیستم وظیفه آنالیز آدرس URL و فراخوانی متد و کنترلر مناسب را بر عهده دارد:
class App {
protected $controller = 'HomeController';
protected $method = 'index';
protected $params = [];
public function __construct() {
$url = $this->parseUrl();
if (file_exists('../app/Controllers/' . ucfirst($url[0]) . 'Controller.php')) {
$this->controller = ucfirst($url[0]) . 'Controller';
unset($url[0]);
}
require_once '../app/Controllers/' . $this->controller . '.php';
$this->controller = new $this->controller;
if (isset($url[1])) {
if (method_exists($this->controller, $url[1])) {
$this->method = $url[1];
unset($url[1]);
}
}
$this->params = $url ? array_values($url) : [];
call_user_func_array([$this->controller, $this->method], $this->params);
}
private function parseUrl() {
if (isset($_GET['url'])) {
return explode('/', filter_var(rtrim($_GET['url'], '/'), FILTER_SANITIZE_URL));
}
return ['home'];
}
}
گام سوم: ساخت کلاس کنترلر پایه (Base Controller)
کلاس کنترلر پایه به ما اجازه میدهد مدلها را به سادگی لود کرده و دادهها را به لایه نمایش (View) بفرستیم:
class Controller {
public function model($model) {
require_once '../app/Models/' . $model . '.php';
return new $model();
}
public function view($view, $data = []) {
require_once '../app/Views/' . $view . '.php';
}
}
گام چهارم: پیادهسازی لایه مدل (Model) برای شبیهسازی دادهها
لایه مدل مستقیماً دادهها را مدیریت میکند. در این بخش یک متد برای بازگرداندن اطلاعات کاربران از دیتابیس شبیهسازی میکنیم:
class UserModel {
public function getAllUsers() {
return [
['id' => 1, 'name' => 'علی احمدی', 'role' => 'مدیر سیستم'],
['id' => 2, 'name' => 'مریم رضایی', 'role' => 'نویسنده ارشد']
];
}
}
گام پنجم: ادغام همهچیز در کنترلر اختصاصی و نمایش خروجی (View)
اکنون کنترلر مخصوص کاربران را ایجاد کرده و لایههای Model و View را در آن هماهنگ میکنیم:
class UserController extends Controller {
public function index() {
$userModel = $this->model('UserModel');
$users = $userModel->getAllUsers();
// ارسال دادهها به فایل ویو
$this->view('user_list', ['users' => $users]);
}
}
حالا در لایه View (فایل app/Views/user_list.php) دادهها را با ساختار تمیز نمایش میدهیم:
< !DOCTYPE html >
< html lang='fa' dir='rtl' >
< head >
< meta charset='UTF-8' >
< title >لیست کاربران< / title >
< / head >
< body >
< h1 >لیست کاربران سیستم< / h1 >
< ul >
< ?php foreach ($data['users'] as $user): ? >
< li >< ?= htmlspecialchars($user['name']) ? > (< ?= htmlspecialchars($user['role']) ? >)< / li >
< ?php endforeach; ? >
< / ul >
< / body >
< / html >
نتیجهگیری و مزیت اجرای پروژه با استاندارد گوگل
با پیادهسازی این معماری، کدهای بکاند شما به کدهایی تمیز، قابل توسعه و ماژولار تبدیل میشوند. این روش باعث بهینهسازی سرعت لود، خوانایی بالا برای رباتهای موتور جستجو (از طریق ساختار آدرسدهی تمیز SEO-Friendly URLs) و سهولت در توسعه گروهی میشود.
پرسش و پاسخ
نظری یافت نشد
برای ارسال نظر ابتدا وارد شوید