Контроллер

Материал из Энциклопедия интернет-маркетинга MarketWiki

Контроллер (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 контроллеры создаются с помощью Artisan-команды php artisan make:controller ProductController. Контроллеры могут наследовать базовый контроллер и использовать трейты.

class ProductController extends Controller {
    public function index() {
        $products = Product::all();
        return view('products.index', compact('products'));
    }
}

В 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 роль контроллера выполняют функции во 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) - содержит значительную часть бизнес-логики. Обычно считается антипаттерном, так как усложняет тестирование и повторное использование кода.

Рекомендуется стремиться к тонким контроллерам, вынося бизнес-логику в сервисы или модели.

Связанные термины

[править]