Ответ
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)
= htmlspecialchars($product['name']) ?>
Цена: = $product['price'] ?> руб.