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’ами

Схема MVC
Схема MVC

Добавляем маршрутизацию (роутинг)

Чтобы приложение могло обрабатывать разные страницы, можно добавить простую маршрутизацию:

<?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
  • Как реализовать простую маршрутизацию и показать страницу профиля