Что такое MVC? Как применить его в PHP?php-41

MVC (Model-View-Controller) — это архитектурный паттерн, разделяющий приложение на три основных компонента:

1. Основные компоненты MVC

Model

class UserModel {
    private $db;

    public function __construct(Database $db) {
        $this->db = $db;
    }

    public function getUsers() {
        return $this->db->query('SELECT * FROM users');
    }

    public function createUser($data) {
        // Валидация и бизнес-логика
        return $this->db->insert('users', $data);
    }
}

Характеристики:

  • Работа с данными (БД, API, файлы)
  • Содержит бизнес-логику
  • Не знает о существовании View и Controller

View

<!-- views/users/list.php -->
<html>
<body>
    <?php foreach ($users as $user): ?>
        <div><?= htmlspecialchars($user['name']) ?></div>
    <?php endforeach; ?>
</body>
</html>

Характеристики:

  • Отвечает только за отображение
  • Минимальная логика (только презентационная)
  • Получает данные от Controller

Controller

class UserController {
    public function list(UserModel $model) {
        $users = $model->getUsers();
        require 'views/users/list.php';
    }

    public function create(Request $request, UserModel $model) {
        if ($request->isPost()) {
            $model->createUser($request->getPost());
            redirect('/users');
        }
        require 'views/users/create.php';
    }
}

Характеристики:

  • Обрабатывает пользовательский ввод
  • Управляет потоком данных между Model и View
  • Не содержит бизнес-логику

2. Реализация MVC в PHP

Базовая структура проекта

project/
├── app/
│   ├── controllers/
│   ├── models/
│   ├── views/
│   └── core/      # Ядро приложения
├── public/
│   └── index.php  # Единая точка входа
└── vendor/

Пример роутинга

require '../vendor/autoload.php';
require '../app/core/Router.php';

$router = new Router();
$router->add('GET', '/users', 'UserController@list');
$router->add('POST', '/users/create', 'UserController@create');

$router->dispatch($_SERVER['REQUEST_METHOD'], $_SERVER['REQUEST_URI']);

Взаимодействие компонентов

  1. Пользователь делает запрос → /users
  2. Роутер определяет контроллер и метод → UserController@list
  3. Контроллер запрашивает данные у модели
  4. Модель возвращает данные из БД
  5. Контроллер передает данные в представление
  6. Представление рендерит HTML

3. Расширенные концепции

Dependency Injection

class UserController {
    private $model;

    public function __construct(UserModel $model) {
        $this->model = $model;
    }

    public function list() {
        $users = $this->model->getUsers();
        // ...
    }
}

Современные реализации

Популярные PHP-фреймворки, использующие MVC:

  • Laravel (Eloquent + Blade)
  • Symfony (Doctrine + Twig)
  • Yii2 (ActiveRecord)
  • CodeIgniter

4. Преимущества и недостатки

Преимущества:

  • Четкое разделение ответственности
  • Упрощение тестирования
  • Повторное использование компонентов
  • Удобство поддержки

Недостатки:

  • Избыточность для простых проектов
  • Крутая кривая обучения для сложных реализаций
  • Возможность нарушения принципов (Fat Controller)

5. Best Practices

  1. Тонкие контроллеры:

    • Максимум 5-7 методов на контроллер
    • Выносите логику в сервисные классы
  2. "Глупые" представления:

    • Минимум PHP-кода в шаблонах
    • Используйте шаблонизаторы (Twig, Blade)
  3. "Умные" модели:

    • Содержат бизнес-логику
    • Инкапсулируют работу с данными
  4. Современные дополнения:

    • Добавьте Service Layer для сложной логики
    • Используйте DTO для передачи данных
    • Реализуйте Middleware для кросс-резачных задач

Резюмируем:

MVC в PHP — это мощный паттерн для организации кода, который особенно полезен в средних и крупных проектах. Современные фреймворки предлагают удобные реализации MVC, но понимание его основных принципов важно даже при их использовании.