SLOT-H: Типы контроллеров
В системе существуют несколько типов контроллеров, каждый из которых предназначен для решения своих задач. Все контроллеры наследуются от базовых классов, расположенных в ядре.
Базовый контроллер
Основной контроллер для работы с веб-интерфейсом. Наследуется от `Application\Assistance\Controller\Controller`. Используется для страниц, которые рендерят HTML.
Базовый контроллер выполняет роль ментора: он следит за доступом, проверяет права, управляет данными, но не вмешивается в работу экшена. Его задача - подготовить окружение и запустить экшен, а после его завершения передать результат в представление.
В базовом контроллере доступны:
- Объект запроса для получения параметров
- Объект представления для передачи данных в шаблон
- Методы редиректа
- Логирование действий пользователя
- Проверка прав доступа
Жизненный цикл базового контроллера:
1. Проверка прав доступа
2. Запуск экшена
3. Экшен возвращает данные
4. Контроллер передаёт данные в представление
5. Контроллер завершает работу
Пример контроллера:
php
namespace Modules\Blog\Controllers;
class Index extends \Application\Assistance\Controller\Controller
{
public function __construct($request)
{
parent::__construct($request);
}
public function indexAction()
{
$this->_view->append(['data' => 'Hello World']);
}
}
API-контроллер
Предназначен для создания JSON-API. Наследуется от Application\Assistance\Controller\ApiController.
Особенности:
Возвращает данные в формате JSON
Не использует шаблонизацию
Работает через объект представления ApiView
Поддерживает стандартный формат ответа
Пример:
php
namespace Modules\Blog\Controllers;
class Api extends \Application\Assistance\Controller\ApiController
{
public function __construct($request)
{
parent::__construct($request);
}
public function getAction()
{
$this->_view->_result = $this->setOk(['data' => 'value']);
}
}
Ответ будет автоматически преобразован в JSON с добавлением служебных полей checksum и sign.
Restful-контроллер
Предназначен для создания REST API. Наследуется от Application\Assistance\Controller\RestfulController.
Особенности:
Поддерживает HTTP-методы GET, POST, PUT, DELETE
Работает с кодами ответа HTTP
Использует RestfulView для представления
Пример:
php
namespace Modules\Blog\Controllers;
class Rest extends \Application\Assistance\Controller\RestfulController
{
public function __construct($request)
{
parent::__construct($request);
}
public function getAction()
{
// обработка GET-запроса
}
public function postAction()
{
// обработка POST-запроса
}
}
CLI-контроллер
Предназначен для работы из командной строки. Наследуется от Application\Assistance\Controller\CliController.
Особенности:
Не использует сессии и куки
Не рендерит представления
Выполняется через CLI-воркер или cron
Используется для фоновых задач
Пример:
php
namespace Modules\Base\Controllers;
class Cli extends \Application\Assistance\Controller\CliController
{
public function __construct($request)
{
parent::__construct($request);
}
public function queueAction()
{
// обработка очереди задач
}
}
Вызов из командной строки:
bash
php Application/Tools/cli.php -stage=project -module=Base -controller=Cli -action=queue
Особенности реализации
Контроллер не знает, с какой моделью он работает. Программист явно вызывает нужную модель в коде экшена.
Все контроллеры используют трейт TraitClass для доступа к общим методам.
Вызываемые экшены в контроллерах должны иметь суффикс Action. Например, indexAction, editAction. Приватные методы именуются так, как удобно разработчику - главное, чтобы было понятно человеку.
Для проверки прав доступа используется массив _access в контроллере. Права проверяются в Preloader модуля перед вызовом экшена.
Создание нового контроллера
Есть два варианта:
- создать вручную (достаточно копипаста существующего и убрать из него не нужное);
- выполнить консольную команду и по подсказке скрипта вызвать его с требуемыми данными, в результате чего получите контроллер, представления для всех экшенов, а таже css и js файлы.
bash
php Application/Tools/createController.php
Что дальше?
- ➡️ Раздел 22. Структура фронтенд части
- ➡️ Раздел 23. Выбор js-оболочки
- ➡️ Раздел 24. Динамическая подпись