Архитектурный паттерн MVC
Разбор концепции Model-View-Controller и понимание грамотного разделения логики приложения, работы с данными и интерфейса.
Архитектура MVC: Фундамент Laravel
Для создания масштабируемого интернет-магазина невозможно писать весь код (работу с БД, HTML-верстку и бизнес-логику) в одном файле. Это приведет к нечитаемому хаосу, известному как 'спагетти-код'. Для решения этой проблемы был придуман архитектурный паттерн MVC (Model-View-Controller). Фреймворк Laravel, на котором мы будем строить наш магазин, строго следует этому паттерну.
Используя метод Чанкинг, разобьем MVC на три составляющие:
- Model (Модель): Отвечает за данные и бизнес-логику. Модель общается с базой данных (через Eloquent ORM в Laravel). Например, модель
Productзнает, как получить товар из БД, проверить его наличие на складе или применить скидку. - View (Представление): Отвечает за интерфейс пользователя (UI). Это HTML-шаблоны (в Laravel используется шаблонизатор Blade), которые получают данные от контроллера и отображают их пользователю. Представление не должно содержать сложных вычислений или прямых запросов к БД.
- Controller (Контроллер): Мозг операции. Принимает HTTP-запрос от пользователя (например, клик по кнопке 'Каталог'), обращается к Модели за нужными данными, а затем передает эти данные в Представление для формирования HTML-страницы.
В Laravel этот процесс начинается с Маршрутизатора (Router), который определяет, какой контроллер должен обработать конкретный URL.
График
Реализация MVC на практике
Давайте посмотрим, как выглядит базовая реализация MVC в Laravel, опираясь на архивные материалы (Вариант 1, Упражнение 3.1). Мы создадим маршрут, контроллер и вернем представление с данными.
1. Маршрутизация (routes/web.php): Мы связываем URL /products с методом index класса ProductController. Имя маршрута name('products.index') используется для удобной генерации ссылок в шаблонах, чтобы при изменении URL не пришлось переписывать весь HTML.
2. Контроллер (app/Http/Controllers/ProductController.php): Метод index обрабатывает запрос. В реальном приложении Laravel мы бы вызвали модель: $products = Product::all();. Но для демонстрации логики мы используем жестко заданный массив данных. Затем функция view() загружает шаблон и передает в него массив переменных.
Разделение ответственности (Separation of Concerns) — главный плюс MVC. Верстальщик может менять View, не трогая PHP-код Контроллера. Разработчик БД может оптимизировать Model, не ломая интерфейс.
<?php
// 1. Маршрутизация (routes/web.php)
use App\Http\Controllers\ProductController;
use Illuminate\Support\Facades\Route;
// При GET запросе на /products вызываем метод index контроллера ProductController
Route::get('/products', [ProductController::class, 'index'])->name('products.index');
// 2. Контроллер (app/Http/Controllers/ProductController.php)
namespace App\Http\Controllers;
class ProductController extends Controller {
public function index() {
// В реальном Laravel проекте здесь была бы работа с Моделью:
// $products = \App\Models\Product::where('price', '>', 0)->get();
// Имитация данных из БД для демонстрации паттерна
$products = [
['id' => 1, 'name' => 'Laptop', 'price' => 1000],
['id' => 2, 'name' => 'Smartphone', 'price' => 500]
];
// Возвращаем Представление (View) 'resources/views/products/index.blade.php'
// и передаем туда данные (массив $products)
return view('products.index', ['products' => $products]);
}
}
?>