Как реализуется архитектурный паттерн MVC?

«Как реализуется архитектурный паттерн MVC?» — вопрос из категории Архитектура, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

MVC (Model-View-Controller) разделяет ответственность приложения на три компонента. Я реализовывал его как в чистых PHP-проектах, так и в рамках фреймворков. **Базовая реализация на PHP:** ```php // Model (Модель) - данные и бизнес-логика class ProductModel { private PDO $db; public function __construct(PDO $db) { $this->db = $db; } public function getAll(): array { $stmt = $this->db->query('SELECT * FROM products'); return $stmt->fetchAll(PDO::FETCH_ASSOC); } public function getById(int $id): ?array { $stmt = $this->db->prepare('SELECT * FROM products WHERE id = ?'); $stmt->execute([$id]); return $stmt->fetch(PDO::FETCH_ASSOC) ?: null; } } // Controller (Контроллер) - обработка запросов class ProductController { private ProductModel $model; private ProductView $view; public function __construct(ProductModel $model, ProductView $view) { $this->model = $model; $this->view = $view; } public function listAction(): string { $products = $this->model->getAll(); return $this->view->render('list', ['products' => $products]); } public function showAction(int $id): string { $product = $this->model->getById($id); if (!$product) { return $this->view->render('404'); } return $this->view->render('show', ['product' => $product]); } } // View (Представление) - отображение class ProductView { public function render(string $template, array $data = []): string { extract($data); ob_start(); include __DIR__ . "/views/product_{$template}.php"; return ob_get_clean(); } } // views/product_list.php foreach ($products as $product): ?>

Цена: руб.

showAction((int)$id); } else { echo $controller->listAction(); } ``` **Как это работает в фреймворках:** - **Laravel**: Контроллеры в `app/Http/Controllers`, модели в `app/Models`, шаблоны Blade в `resources/views` - **Symfony**: Контроллеры как методы классов с аннотациями `@Route`, Twig шаблоны - **Yii2**: Контроллеры наследуют `yiiwebController`, представления в `.php` файлах **Преимущества MVC:** - Четкое разделение ответственности - Упрощенное тестирование (можно тестировать модели отдельно от представлений) - Повторное использование кода (одна модель может использоваться разными представлениями) - Легкая замена слоя представления (например, с HTML на JSON для API)