MVC паттерн

Тренажер по PHP для пользователей с начальным уровнем подготовки.

Тренажер PHP

MVC (Model-View-Controller) — один из самых популярных архитектурных паттернов в веб-разработке. Он помогает разделить код приложения на три логических слоя: Model отвечает за данные и бизнес-логику, View занимается отображением информации пользователю, а Controller обрабатывает входящие запросы и координирует работу первых двух. Такое разделение делает код более организованным, упрощает тестирование и позволяет нескольким разработчикам работать над разными частями приложения параллельно. В этом тренажере ты разберёшься, какой компонент за что отвечает, как они взаимодействуют между собой, и попрактикуешься в написании типичного MVC-кода на PHP. Задания построены от простого к сложному: сначала научишься различать компоненты, потом соберёшь их воедино.

Список тем

1. Компоненты MVC и их обязанности

id: 39372_task1

Сопоставь каждый компонент паттерна MVC с его основной зоной ответственности. Подумай, какой слой занимается данными, какой — отображением, а какой — обработкой запросов.

Сопоставьте строки в правой(нижней) части с соответствующими строками в левой(верхней) по порядковому номеру
Model
View
Controller
Обработка запросов и координация компонентов
Работа с данными и бизнес-логика
Отображение данных пользователю (HTML, шаблоны)
Сообщения
Проверить
Показать подсказку

2. Распредели код по компонентам MVC

id: 39372_task2

Перед тобой фрагменты кода из разных частей MVC-приложения. Распредели их по соответствующим категориям: Model, View или Controller.

Перетяните элементы в соответствующие блоки
Model
View
Controller
$stmt = $pdo->query("SELECT * FROM users");
<h1><?= $title ?></h1>
$id = $_GET['id'];
return $stmt->fetchAll();
<ul>&lt;?php foreach($items as $item): ?><li><?= $item ?></li>&lt;?php endforeach; ?></ul>
$user = $userModel->findById($id);
$this->db->prepare("INSERT INTO posts VALUES (?)");
include 'views/user.php';
Сообщения
Проверить
Показать подсказку

3. Кто вызывает кого в MVC?

id: 39372_task3

В классическом MVC-паттерне пользователь отправляет запрос. Какой компонент первым получает и обрабатывает этот запрос?

Выберите правильный вариант ответа

Поток запроса в MVC:

Пользователь → HTTP-запрос → ? → Model → View → Ответ пользователю

Какой компонент стоит на месте знака вопроса?

Сообщения
Проверить
Показать подсказку

4. Базовый класс Model

id: 39372_task4

Дополни класс Model, который устанавливает соединение с базой данных в конструкторе. Используй PDO для подключения к MySQL.

Заполните пропуски
class Model {
    protected $db;
    
    public function __construct() {
        $dsn = 'mysql:host=localhost;dbname=shop';
        input1S->db = input2S PDO($dsn, 'root', '');
    }
}
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

5. Исправь метод Model для получения данных

id: 39372_task5

В методе getAll() класса ProductModel есть ошибки. Найди и исправь их, чтобы метод корректно возвращал все товары из таблицы products.

Найдите ошибку и исправьте
class ProductModel extends Model {
    public function getAll() {
        $stmt = this->db->query("SELECT * FROM products");
        return $stmt->fetchall();
    }
}
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

6. Собери метод Controller

id: 39372_task6

Собери метод контроллера, который получает список товаров из модели и передаёт их в представление. Используй токены из банка.

Нужно правильно расставить в пропуски предложенные варианты
class ProductController {
    public function index() {
        $model = input1S ProductModel();
        $products = $model->input2S();
        input3S 'views/products/index.php';
    }
}
new
getAll
include
require
fetch
create
echo
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

7. Порядок обработки запроса в MVC

id: 39372_task7

Расставь этапы обработки HTTP-запроса в MVC-приложении в правильном порядке — от момента, когда пользователь нажал ссылку, до отображения страницы в браузере.

Расставьте строки в правильном порядке
Браузер отображает полученный HTML
View формирует HTML-страницу с данными
Controller передаёт данные во View
Router определяет нужный Controller и action
Пользователь отправляет HTTP-запрос
Запрос поступает в index.php (front controller)
Model возвращает данные из базы
Controller вызывает метод Model для получения данных
Сообщения
Проверить
Показать подсказку

8. View: вывод списка товаров

id: 39372_task8

Дополни шаблон View для вывода списка товаров. Используй короткий синтаксис PHP для echo и альтернативный синтаксис для foreach.

Заполните пропуски
<h1>Каталог товаров</h1>
<ul>
<?php input1S ($products as $product): ?>
    <li>
        <strong><?= $product[input2S] ?></strong>
        <span>Цена: input3S $product['price'] ?> руб.</span>
    </li>
<?php input4S; ?>
</ul>
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

9. Что выведет View?

id: 39372_task9

Посмотри на код контроллера и шаблона. Определи, что будет выведено на экран.

Что должно получиться?
// Controller
class PageController {
    public function about() {
        $title = "О компании";
        include 'views/about.php';
    }
}

// views/about.php
<h1><?= $title ?></h1>
Сообщения
Проверить
Показать подсказку

10. Собери простой Router

id: 39372_task10

Собери код простого маршрутизатора, который получает action из GET-параметра и вызывает соответствующий метод контроллера. По умолчанию вызывается метод index.

Перетяните в правильном порядке строки из одного блока в другой
<?php
$action = $_GET['action'] ?? 'index';
$controller = new ProductController();
if (method_exists($controller, $action)) {
    $controller->$action();
}
$action = $_POST['action'];
echo $controller->action;
$controller->action();
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

11. Исправь передачу данных в View

id: 39372_task11

Контроллер должен передавать данные во View, но допущены ошибки. Исправь код так, чтобы View получил массив пользователей.

Найдите ошибку и исправьте
class UserController {
    public function list() {
        $model = new UserModel();
        $users = $model::getAll();
        include views/users/list.php;
    }
}
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

12. Где должна быть валидация данных?

id: 39372_task12

Пользователь отправляет форму регистрации с email и паролем. Согласно принципам MVC, в каком компоненте должна находиться логика проверки корректности email?

Выберите правильный вариант ответа

Сценарий:

Форма регистрации отправляет данные:

  • email: user@example.com
  • password: secret123

Вопрос: Где проверять, что email имеет корректный формат?

Сообщения
Проверить
Показать подсказку

13. Полный цикл: создание записи

id: 39372_task13

Собери метод контроллера для создания нового товара. Метод должен: проверить метод запроса, получить данные из POST, вызвать модель для сохранения, сделать редирект на список товаров.

Перетяните в правильном порядке строки из одного блока в другой
public function store() {
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$name = $_POST['name'];
$price = $_POST['price'];
$model = new ProductModel();
$model->create($name, $price);
header('Location: /products');
}
}
$model->save($name);
echo "Товар создан";
$_GET['name'];
return $model;
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

14. Model: метод поиска по ID

id: 39372_task14

Дополни метод findById в классе Model. Метод должен использовать подготовленный запрос (prepared statement) для безопасного поиска записи по ID.

Заполните пропуски
class ProductModel extends Model {
    public function findById($id) {
        $sql = "SELECT * FROM products WHERE id = input1S";
        $stmt = $this->db->input2S($sql);
        $stmt->input3S([$id]);
        return $stmt->input4S();
    }
}
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

15. Преимущества и недостатки MVC

id: 39372_task15

Распредели утверждения по категориям: что является преимуществом паттерна MVC, а что — его недостатком или ограничением.

Перетяните элементы в соответствующие блоки
Преимущества MVC
Недостатки MVC
Разделение ответственности между компонентами
Увеличение количества файлов и классов
Легче тестировать отдельные части приложения
Избыточен для очень маленьких проектов
Несколько разработчиков могут работать параллельно
Требует времени на изучение структуры
Проще заменить или изменить отдельный слой
Сообщения
Проверить
Показать подсказку

PHP: запуск кода в браузере

id: 39372_compiler
🐘
Запустить тренажёр (PHP)
НайтиКурс.Ру