Контроллер
Контроллер (Controller) - это компонент архитектурного шаблона MVC (Model-View-Controller), который обрабатывает пользовательский ввод, взаимодействует с моделью для получения или изменения данных и определяет, какое представление должно быть показано пользователю. Контроллер выступает связующим звеном между пользовательским интерфейсом и бизнес-логикой приложения.
В интернет-маркетинге контроллеры используются при разработке сложных маркетинговых платформ, систем управления контентом и инструментов аналитики для обработки запросов пользователей, управления данными и выбора правильного ответа.
Роль контроллера в MVC
[править]В архитектуре MVC контроллер выполняет несколько ключевых функций:
- Приём запросов. Контроллер получает все входящие запросы от пользователя (переход по URL, отправка формы, AJAX-запрос).
- Анализ запроса. Контроллер определяет, какое действие необходимо выполнить и какие данные нужны.
- Взаимодействие с моделью. Контроллер вызывает методы модели для получения, сохранения или изменения данных.
- Выбор представления. Контроллер определяет, какое представление должно быть показано пользователю, и передаёт ему данные.
- Перенаправления. Контроллер может выполнять редирект на другие страницы.
Контроллер не должен содержать бизнес-логику (она в модели) и не должен формировать HTML (это задача представления).
Типичная структура контроллера
[править]В большинстве веб-фреймворков контроллер представляет собой класс с методами-действиями (actions). Каждый метод соответствует одному действию пользователя.
class ProductController {
// Список всех товаров
function index() {
$products = Product::all();
return view('products.index', ['products' => $products]);
}
// Просмотр 1 товара
function show($id) {
$product = Product::find($id);
return view('products.show', ['product' => $product]);
}
// Форма создания нового товара
function create() {
return view('products.create');
}
// Сохранение нового товара
function store($request) {
$product = new Product();
$product->name = $request->name;
$product->price = $request->price;
$product->save();
return redirect('/products');
}
// Удаление товара
function delete($id) {
$product = Product::find($id);
$product->delete();
return redirect('/products');
}
}
Маршрутизация
[править]Контроллеры связаны с URL через маршрутизацию (routing). Маршруты определяют, какой контроллер и какое действие должны обработать запрос по определённому URL.
Пример маршрутов в Laravel:
Route::get('/products', [ProductController::class, 'index']);
Route::get('/products/{id}', [ProductController::class, 'show']);
Route::post('/products', [ProductController::class, 'store']);
Route::delete('/products/{id}', [ProductController::class, 'delete']);
RESTful-контроллеры
[править]Современные фреймворки поддерживают RESTful-архитектуру, где контроллеры имеют стандартную структуру методов для работы с ресурсами:
| Метод HTTP | URL | Действие контроллера | Назначение |
|---|---|---|---|
| GET | /products | index() | Список всех ресурсов |
| GET | /products/create | create() | Форма создания нового ресурса |
| POST | /products | store() | Сохранение нового ресурса |
| GET | /products/{id} | show() | Просмотр конкретного ресурса |
| GET | /products/{id}/edit | edit() | Форма редактирования ресурса |
| PUT/PATCH | /products/{id} | update() | Обновление ресурса |
| DELETE | /products/{id} | destroy() | Удаление ресурса |
Контроллеры в популярных фреймворках =
[править]Laravel
[править]В Laravel контроллеры создаются с помощью Artisan-команды php artisan make:controller ProductController. Контроллеры могут наследовать базовый контроллер и использовать трейты.
class ProductController extends Controller {
public function index() {
$products = Product::all();
return view('products.index', compact('products'));
}
}
Symfony
[править]В Symfony контроллеры реализуются как классы с аннотациями или атрибутами для маршрутизации.
class ProductController {
#[Route('/products', name: 'product_list')]
public function index() {
$products = $this->getDoctrine()->getRepository(Product::class)->findAll();
return $this->render('products/index.html.twig', [
'products' => $products
]);
}
}
Django
[править]В Django роль контроллера выполняют функции во views.py. Маршруты задаются отдельно в urls.py.
def product_list(request):
products = Product.objects.all()
return render(request, 'products/list.html', {'products': products})
Тонкий и толстый контроллер
[править]В сообществе MVC существуют 2 противоположные концепции:
- Тонкий контроллер (thin controller) - содержит минимум логики, только связь между моделью и представлением. Вся бизнес-логика вынесена в модель.
- Толстый контроллер (fat controller) - содержит значительную часть бизнес-логики. Обычно считается антипаттерном, так как усложняет тестирование и повторное использование кода.
Рекомендуется стремиться к тонким контроллерам, вынося бизнес-логику в сервисы или модели.
