Архитектура

MVC: что это такое и зачем

Никита Литвяков
Никита Литвяков
Senior PHP / Laravel Backend Developer
Обложка статьи: MVC

MVC (Model-View-Controller) — это способ разложить код приложения на три слоя так, чтобы каждый занимался своим делом. Не библиотека и не фреймворк, а архитектурный паттерн. Большинство веб-фреймворков — Laravel, Symfony, Rails, Django — построены вокруг него.

Три слоя

Model — данные и работа с ними. В Laravel это Eloquent-модели: User, Post, Order. Модель знает, как лежат данные в БД и какие у них связи. Она ничего не знает про HTML и про HTTP.

View — то, что видит пользователь. Шаблон Blade, Vue-компонент через Inertia, JSON-ответ от API. View получает готовые данные и отвечает только за их отображение. Никакой бизнес-логики.

Controller — посредник. Принимает HTTP-запрос, достаёт нужные данные через модели, передаёт во View и возвращает ответ. Контроллер — это «склейка», а не место, где живёт логика.

Зачем это нужно

Когда всё в одном файле, любое изменение ломает соседние участки. MVC даёт разделение ответственности:

  • дизайнер правит View, не трогая БД;
  • DBA меняет схему — Model скрывает это от остального кода;
  • бизнес-логика тестируется отдельно от HTTP.

Это упрощает поддержку, тесты и работу в команде.

Как это выглядит в Laravel

Route::get('/posts/{post}', [PostController::class, 'show']);

class PostController
{
    public function show(Post $post)
    {
        return Inertia::render('Posts/Show', [
            'post' => $post->load('author'),
        ]);
    }
}

Маршрут → контроллер → модель → view. Один поток данных, понятный любому, кто знает фреймворк.

Главная ловушка

«Толстые контроллеры» и «толстые модели». В контроллер начинают пихать бизнес-правила, в модель — отправку email, обращения к внешним API, генерацию PDF. Кода становится много, тестировать тяжело, переиспользовать невозможно.

Выход — вынести бизнес-логику из контроллера и модели в отдельный слой. Об этом — в следующей статье.

Запомнить

  • Model — данные, View — отображение, Controller — связующее звено.
  • Контроллер должен быть тонким.
  • Модель — про хранение, а не про всю логику приложения.
  • Когда логика разрастается, MVC сам по себе уже не спасает — нужны дополнительные слои.
#Архитектура #PHP #Laravel #Backend
Поделиться:

Также может быть интересно