← Назад к вопросам

Что за что отвечает в MVC?

1.7 Middle🔥 172 комментариев
#Архитектура и паттерны

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI7 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Объяснение паттерна MVC для Backend PHP

MVC (Model-View-Controller) — это архитектурный паттерн, который разделяет приложение на три взаимосвязанных компонента для обеспечения чистоты кода, удобства тестирования и поддержки. В контексте PHP Backend каждый компонент имеет строго определенные обязанности.

Model (Модель) - Отвечает за данные и бизнес-логику

Модель — это ядро приложения, которое:

  • Управляет данными и бизнес-логикой
  • Обеспечивает работу с базой данных
  • Содержит валидацию и правила предметной области
  • НЕ зависит от представления и контроллера
<?php
// Пример модели User в PHP
class UserModel {
    private $db;
    
    public function __construct(Database $db) {
        $this->db = $db;
    }
    
    public function getUserById(int $id): ?array {
        $query = "SELECT * FROM users WHERE id = :id";
        $stmt = $this->db->prepare($query);
        $stmt->bindParam(':id', $id, PDO::PARAM_INT);
        $stmt->execute();
        
        return $stmt->fetch(PDO::FETCH_ASSOC);
    }
    
    public function createUser(array $userData): bool {
        // Валидация и бизнес-правила
        if (!$this->validateUserData($userData)) {
            return false;
        }
        
        $query = "INSERT INTO users (email, name) VALUES (:email, :name)";
        $stmt = $this->db->prepare($query);
        
        return $stmt->execute([
            ':email' => $userData['email'],
            ':name' => $userData['name']
        ]);
    }
}
?>

View (Представление) - Отвечает за отображение данных

Представление — это слой отображения, который:

  • Форматирует и показывает данные пользователю
  • Содержит HTML, CSS и минимальную логику отображения
  • Получает данные от контроллера (НЕ от модели напрямую)
  • Пассивно и не изменяет данные
<?php
// Пример представления в PHP (шаблон)
// user_profile.php
?>
<!DOCTYPE html>
<html>
<head>
    <title>Профиль пользователя</title>
</head>
<body>
    <h1>Профиль: <?php echo htmlspecialchars($user['name']); ?></h1>
    <div class="user-info">
        <p>Email: <?php echo htmlspecialchars($user['email']); ?></p>
        <p>Зарегистрирован: <?php echo date('d.m.Y', strtotime($user['created_at'])); ?></p>
    </div>
    
    <?php if (!empty($user['orders'])): ?>
        <h2>Последние заказы:</h2>
        <ul>
            <?php foreach ($user['orders'] as $order): ?>
                <li><?php echo htmlspecialchars($order['title']); ?></li>
            <?php endforeach; ?>
        </ul>
    <?php endif; ?>
</body>
</html>

Controller (Контроллер) - Отвечает за обработку запросов и управление потоком

Контроллер — это посредник между моделью и представлением, который:

  • Обрабатывает HTTP-запросы пользователя
  • Вызывает соответствующие методы модели
  • Выбирает представление для отображения
  • Передает данные из модели в представление
  • Обрабатывает ошибки и редиректы
<?php
// Пример контроллера в PHP
class UserController {
    private $userModel;
    private $viewRenderer;
    
    public function __construct(UserModel $model, ViewRenderer $renderer) {
        $this->userModel = $model;
        $this->viewRenderer = $renderer;
    }
    
    public function showProfile(int $userId): void {
        try {
            // 1. Получаем данные из модели
            $user = $this->userModel->getUserById($userId);
            
            if (!$user) {
                // 2. Обрабатываем ошибки
                $this->viewRenderer->render('404.php');
                return;
            }
            
            // 3. Подготавливаем данные для представления
            $data = [
                'user' => $user,
                'page_title' => 'Профиль пользователя'
            ];
            
            // 4. Выбираем и отображаем представление
            $this->viewRenderer->render('user_profile.php', $data);
            
        } catch (Exception $e) {
            // Обработка исключений
            error_log($e->getMessage());
            $this->viewRenderer->render('error.php');
        }
    }
}
?>

Взаимодействие компонентов и типичный поток выполнения:

  1. Пользователь делает запрос через браузер
  2. Front Controller (index.php) определяет соответствующий контроллер и действие
  3. Контроллер получает параметры запроса и вызывает методы модели
  4. Модель работает с базой данных и возвращает данные контроллеру
  5. Контроллер передает данные в представление
  6. Представление генерирует HTML ответ
  7. Ответ отправляется пользователю

Ключевые принципы и преимущества MVC в PHP:

  • Разделение ответственности - каждый компонент выполняет одну четкую задачу
  • Повторное использование кода - модели можно использовать в разных контроллерах
  • Удобство тестирования - компоненты можно тестировать изолированно
  • Гибкость - можно менять представление без изменения бизнес-логики
  • Командная разработка - разные разработчики могут работать над разными слоями

Распространенные ошибки реализации в PHP:

  1. Толстые контроллеры - помещение бизнес-логики в контроллеры
  2. Тонкие модели - модели только как обертки для базы данных
  3. Нарушение границ - прямое обращение представления к модели
  4. Отсутствие Dependency Injection - жесткие зависимости между компонентами

В современных PHP-фреймворках (Laravel, Symfony, Yii) MVC часто расширяется дополнительными паттернами: Repository, Service Layer, DTO, что делает архитектуру еще более гибкой и поддерживаемой.