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 сам по себе уже не спасает — нужны дополнительные слои.
Также может быть интересно
Сервисный слой в Laravel: куда уносить бизнес-логику
Когда контроллеры и модели начинают пухнуть — пора выносить логику в отдельный слой. Разбираем, как и зачем.
Читать далее →