08. Архитектура MVC: контроллеры, модели, представления
Введение в MVC
MVC (Model-View-Controller) — это архитектурный шаблон, который помогает структурировать код и разделять обязанности между частями приложения.MVC = Модель (Model) + Представление (View) + Контроллер (Controller).
Вместо того, чтобы всё писать в одном файле, мы разделяем:
- Model — работает с данными и базой данных
- View — отвечает за внешний вид (HTML, шаблоны)
- Controller — обрабатывает запросы и связывает Model с View
Зачем нужен MVC
Представьте, что ваш сайт растёт. Вы добавляете новые страницы, формы, пользователей… Если всё в одном файле, проект превращается в кашу.MVC решает это:
- Код становится читаемым и поддерживаемым
- Можно менять внешний вид, не трогая логику
- Можно менять базу, не ломая интерфейс
Структура проекта
my_app/
├── core/
│ ├── Database.php
│ └── Controller.php
├── models/
│ └── UserModel.php
├── views/
│ └── users.php
├── controllers/
│ └── UserController.php
└── index.php
Model (Модель)
Модель работает с базой данных и хранит логику, связанную с данными.
<?php
class UserModel extends Database {
public function getAll() {
return $this->query('SELECT * FROM users')->fetchAll();
}public function findById($id) {
return $this->query('SELECT * FROM users WHERE id = ?', [$id])->fetch();
}
}
?>
Пояснение
- Модель ничего не знает о том, как данные будут показаны
- Она просто возвращает результат из базы
View (Представление)
View — это шаблон страницы, который выводит данные пользователю.
<!doctype html>
<html lang='ru'>
<head>
<meta charset='utf-8'>
<title>Список пользователей</title>
<style>
body { font-family: sans-serif; }
table { border-collapse: collapse; width: 60%; }
th, td { border: 1px solid #ccc; padding: 6px; }
th { background: #f2f2f2; }
</style>
</head>
<body>
<h2>Пользователи</h2>
<table>
<tr><th>ID</th><th>Имя</th><th>Email</th></tr>
<?php foreach ($users as $user): ?>
<tr>
<td><?= htmlspecialchars($user['id']) ?></td>
<td><?= htmlspecialchars($user['name']) ?></td>
<td><?= htmlspecialchars($user['email']) ?></td>
</tr>
<?php endforeach; ?>
</table>
</body>
</html>
Что важно
- Во View нет SQL-запросов
- Контроллер передаёт сюда массив с данными
- Вывод всегда безопасен через htmlspecialchars()
Controller (Контроллер)
Контроллер — это связующее звено. Он получает запрос, вызывает нужную модель и подставляет данные в шаблон.
<?php
require_once 'models/UserModel.php';class UserController {
public function index() {
$userModel = new UserModel();
$users = $userModel->getAll();
include 'views/users.php';
}
}
?>
Разбор
- Контроллер ничего не знает о базе данных — только вызывает модель
- Контроллер решает, какой шаблон использовать
Точка входа — index.php
Все запросы проходят через один файл — index.php. Он определяет, какой контроллер и метод запустить.
<?php
require 'controllers/UserController.php';$controller = new UserController();
$controller->index();
?>
Пример работы всей системы
1️⃣ Браузер запрашивает index.php 2️⃣ Контроллер UserController получает запрос 3️⃣ Он вызывает UserModel, чтобы получить данные 4️⃣ Передаёт массив $users в шаблон users.php 5️⃣ Пользователь видит таблицу с именами и email’амиДобавляем маршрутизацию (роутинг)
Чтобы приложение могло обрабатывать разные страницы, можно добавить простую маршрутизацию:
<?php
// index.php
require 'controllers/UserController.php';$action = $_GET['action'] ?? 'index';
$controller = new UserController();
if (method_exists($controller, $action)) {
$controller->$action();
} else {
echo 'Страница не найдена';
}
?>
Теперь можно открыть:
- index.php?action=index — список пользователей
- index.php?action=show&id=1 — конкретный пользователь (если реализовать метод show())
Мини-проект: страница профиля пользователя
Добавим в UserController новый метод:
public function show() {
$id = $_GET['id'] ?? null;
if (!$id) {
echo 'Не указан ID пользователя';
return;
}$model = new UserModel();
$user = $model->findById($id);
include 'views/profile.php';
}
Создайте файл views/profile.php:
<!doctype html>
<html lang='ru'>
<head>
<meta charset='utf-8'>
<title>Профиль пользователя</title>
</head>
<body>
<h2>Профиль: <?= htmlspecialchars($user['name']) ?></h2>
<p>Email: <?= htmlspecialchars($user['email']) ?></p>
<p>Дата регистрации: <?= htmlspecialchars($user['created_at']) ?></p>
<a href='index.php'>Назад</a>
</body>
</html>
Теперь можно открыть в браузере: http://localhost/my_app/index.php?action=show&id=1
Преимущества MVC
- Разделение логики, представления и данных
- Легче поддерживать и тестировать проект
- Можно менять дизайн, не трогая PHP-код
- Удобно масштабировать проект и добавлять новые модули
Итоги урока
Теперь вы знаете:- Что такое MVC и зачем оно нужно
- Как создать структуру проекта с контроллером, моделью и шаблоном
- Как работает связь Model → Controller → View
- Как реализовать простую маршрутизацию и показать страницу профиля