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

Что такое модель в MVC?

1.0 Junior🔥 111 комментариев
#Архитектура и паттерны#Фреймворки

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

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

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

Что такое модель в MVC

В архитектуре Model-View-Controller (MVC), модель (Model) — это центральный компонент, отвечающий за бизнес-логику приложения, работу с данными и их состояние. Она инкапсулирует данные, правила их обработки и взаимодействие с источниками данных (например, базами данных, API), обеспечивая независимость от представления (View) и контроллера (Controller). В контексте PHP Backend-разработки модель играет ключевую роль в организации кода, соблюдении принципов SRP (Single Responsibility Principle) и разделения ответственности.

Основные функции модели

  1. Управление данными: Модель представляет структуру данных приложения (например, пользователь, статья, заказ) и их атрибуты. Она отвечает за валидацию, преобразование и сохранение целостности данных.
  2. Бизнес-логика: В модели реализуются основные операции приложения — расчеты, проверки, workflows. Например, проверка доступности товара на складе перед оформлением заказа.
  3. Взаимодействие с хранилищами: Модель обеспечивает CRUD-операции (Create, Read, Update, Delete) с базой данных или другими источниками. В PHP-фреймворках (Laravel, Symfony) это часто реализуется через ORM (Object-Relational Mapping), такие как Eloquent или Doctrine.
  4. Изоляция от UI: Модель не зависит от способа отображения данных (View) или обработки HTTP-запросов (Controller), что упрощает тестирование и модификацию.

Пример модели в PHP (Laravel Eloquent)

В Laravel модель обычно наследует класс Model и взаимодействует с таблицей БД. Рассмотрим простую модель User:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    // Связь с таблицей 'users' (автоматически по имени класса)
    protected $table = 'users';
    
    // Разрешенные для массового заполнения поля
    protected $fillable = ['name', 'email', 'password'];
    
    // Скрытие чувствительных данных (например, пароль)
    protected $hidden = ['password'];
    
    // Бизнес-логика: проверка, является ли пользователь администратором
    public function isAdmin(): bool
    {
        return $this->role === 'admin';
    }
    
    // Связь с другими моделями (например, статьи пользователя)
    public function articles()
    {
        return $this->hasMany(Article::class);
    }
}

Структура модели в чистых PHP-проектах

В приложениях без фреймворков модель может быть реализована как класс с методами для работы с данными. Пример:

<?php

class Product
{
    private int $id;
    private string $name;
    private float $price;
    
    public function __construct(int $id, string $name, float $price)
    {
        $this->id = $id;
        $this->name = $name;
        $this->price = $price;
    }
    
    // Геттеры и сеттеры для инкапсуляции
    public function getName(): string
    {
        return $this->name;
    }
    
    public function calculateTax(float $rate): float
    {
        return $this->price * $rate; // Бизнес-логика: расчет налога
    }
    
    // Метод для сохранения в БД (упрощенный пример)
    public function save(PDO $dbConnection): bool
    {
        $stmt = $dbConnection->prepare("INSERT INTO products (name, price) VALUES (?, ?)");
        return $stmt->execute([$this->name, $this->price]);
    }
}

Роль модели в MVC-взаимодействии

  • Контроллер обрабатывает запросы, получает данные от модели и передает их в представление.
  • Представление отображает данные модели, не изменяя их.
  • Модель не знает о контроллере или представлении, что снижает связность системы.

Лучшие практики для моделей в PHP Backend

  • Тонкие модели vs Толстые модели: В современных подходах рекомендуется разделять ответственность: модель содержит только данные и базовую логику, а сложные операции выносятся в сервисные классы или репозитории.
  • Использование ORM: ORM типа Eloquent или Doctrine упрощают работу с БД, но важно избегать N+1 problem и оптимизировать запросы.
  • Валидация данных: Модель должна проверять корректность данных перед сохранением, но в некоторых фреймворках валидация делегируется Form Request (Laravel) или отдельным валидаторам.
  • Тестируемость: Благодаря изоляции, модели легко тестировать юнит-тестами без зависимости от внешних компонентов.

Отличия от других компонентов MVC

  • Модель vs Контроллер: Контроллер обрабатывает ввод пользователя и координирует модель/представление, но не содержит бизнес-логики.
  • Модель vs Представление: Представление отвечает за отображение данных, но не за их обработку.

В PHP-экосистеме модель эволюционировала: в Laravel это активная запись (Active Record), в Symfony — сущности Doctrine (Data Mapper). Выбор зависит от требований проекта, но суть остается неизменной: модель — это единственный источник истины для данных и бизнес-правил в приложении.