Архитектурный паттерн MVC
Разделение логики приложения на модели, представления и контроллеры для грамотного структурирования кода.
В предыдущих уроках мы изучили основы PHP, объектно-ориентированное программирование и работу с базами данных MySQL. Теперь, прежде чем переходить к фреймворку Laravel, критически важно понять фундаментальную архитектуру, на которой он построен — паттерн MVC (Model-View-Controller). Паттерн проектирования — это типовое, проверенное временем решение частой проблемы в архитектуре программного обеспечения. В контексте веб-разработки главной проблемой всегда было смешивание логики (например, SQL-запросов) и отображения (HTML-тегов) в одном файле. Это приводило к созданию так называемого 'спагетти-кода', который невозможно масштабировать, тестировать и поддерживать. Паттерн MVC решает эту проблему, строго разделяя приложение на три взаимосвязанных, но независимых компонента.
Модель (Model) отвечает за бизнес-логику и данные приложения. Она ничего не знает о том, как данные будут показаны пользователю. Ее задача — извлечь данные из базы данных (например, таблицу товаров), обработать их (применить скидки, проверить наличие на складе) и вернуть результат. Представление (View) отвечает исключительно за пользовательский интерфейс. Это HTML, CSS и минимальные вкрапления PHP для вывода данных. Представление получает готовые данные и просто 'рисует' их. Контроллер (Controller) — это связующее звено, мозг операции. Он принимает HTTP-запрос от пользователя (например, клик по кнопке 'Добавить в корзину'), обращается к нужной Модели за данными, а затем передает эти данные в соответствующее Представление для генерации HTML-ответа.
Рассмотрим применение MVC на примере нашего будущего интернет-магазина. Представьте сценарий: пользователь заходит на страницу каталога товаров (URL: /products). Жизненный цикл запроса выглядит следующим образом: 1. Пользователь вводит URL. Маршрутизатор (Router) перехватывает этот запрос и направляет его в ProductController. 2. Метод index() в ProductController понимает, что нужно показать список товаров. Он обращается к модели Product. 3. Модель Product выполняет SQL-запрос к базе данных MySQL (например, SELECT * FROM products WHERE active = 1) и возвращает массив объектов товаров обратно в контроллер. 4. Контроллер берет этот массив и передает его в представление products.index. 5. Представление использует цикл (например, foreach), чтобы сгенерировать HTML-карточки для каждого товара, подставляя названия и цены. 6. Готовый HTML-документ отправляется обратно в браузер пользователя.
Типичная ошибка новичков: Написание SQL-запросов прямо в контроллере или, что еще хуже, в представлении. Запомните золотое правило MVC: 'Толстые модели, тонкие контроллеры'. Контроллер должен содержать минимум логики — только прием запроса, делегирование задачи модели и возврат ответа. Вся сложная бизнес-логика (расчет налогов, проверка прав) должна инкапсулироваться внутри моделей или специализированных сервисных классов. Это позволяет переиспользовать логику в разных частях приложения (например, при создании API для мобильного приложения вам не придется дублировать код, вы просто обратитесь к той же модели).
График
// Пример концепции контроллера (до Laravel)
class ProductController {
public function index() {
// 1. Обращение к Модели
$productModel = new ProductModel();
$products = $productModel->getAllActiveProducts();
// 2. Передача данных в Представление
require_once 'views/products_list.php';
}
}
// Пример концепции Модели
class ProductModel {
public function getAllActiveProducts() {
// В реальности здесь PDO запрос к БД
return [
['id' => 1, 'name' => 'Laptop', 'price' => 1000],
['id' => 2, 'name' => 'Mouse', 'price' => 50]
];
}
}
Какой компонент в паттерне MVC должен отвечать за выполнение SQL-запросов к базе данных?
Как называется компонент MVC, который принимает HTTP-запрос от пользователя и управляет потоком данных между моделью и представлением?
Флеш-карточки
За что отвечает Model (Модель)?
Нажмите, чтобы увидеть ответ
За бизнес-логику, структуру данных и взаимодействие с базой данных.
Нажмите, чтобы вернуться
За что отвечает View (Представление)?
Нажмите, чтобы увидеть ответ
За пользовательский интерфейс, генерацию HTML и отображение данных.
Нажмите, чтобы вернуться
За что отвечает Controller (Контроллер)?
Нажмите, чтобы увидеть ответ
За обработку HTTP-запросов, связь между Моделью и Представлением.
Нажмите, чтобы вернуться