Контроллер — часть архитектуры MVC (Action-Domain-Responder для веб), отвечает за дальнейшее управление обработкой запроса, уже идентифицированного маршрутизатором, но не должен содержать бизнес-логику.
Во фреймворке HLEB2 контроллерами являются обычные классы-обработчики, привязанные к маршруту методом controller().
Этот метод указывает на класс контроллера и его выполняемый метод.
При совпадении — фреймворк создаёт объект этого класса и вызывает метод.
Класс контроллера должен быть унаследован от Hleb\Base\Controller.
Фреймворк производит поиск контроллера в папке /app/Controllers/ согласно его namespace. Вот код контроллера по умолчанию:
В примере метод 'index' контроллера возвращает объект View, сформированный функцией view() и указывающий на шаблон из папки /resources/views/.
Будет использован шаблон /resources/views/default.php
Это простой пример, так как можно использовать эту функцию аналогичным образом в маршруте.
Первым аргументом функции назначается шаблон, вторым - именованный массив для передачи в шаблон переменных и их значений, третьим аргументом можно указать числовой код состояния ответа.
Если использовать этот пример в контроллере, то будет вызван шаблон /resources/views/template/file.php.
В файле будут доступны переменные $title и $description c соответствующими значениями:
В случае, если расширение файла шаблона не .php, например, шаблон .twig, то нужно переименовать в функции путь к шаблону, указав расширение.
Кроме уже упомянутого объекта View, из метода контроллера могут возвращаться и другие типы значений:
string|int|float - эти типы будут преобразованы в строку и выведены в исходном виде как текст.
array - возвращаемый массив будет преобразован в JSON-строку.
bool - если возвращается false, то будет выведена стандартная ошибка 404.
Объект (из контейнера) с интерфейсом Hleb\Reference\ResponseInterface - будет преобразован в ответ.
Объект с интерфейсом Psr\Http\Message\ResponseInterface - будет преобразован в ответ.
При ответе массивом как JSON на запрос GET может возникнуть XSSI перехват JSON, поэтому лучше отправить именованный массив, который преобразуется в объект как JSON.
Вместе с динамическим маршрутом могут быть определены значения фреймворком, совпадающие с именованными частями URL. Например, для следующего маршрута:
Переменные $version и $page могут быть подставлены в метод контроллера 'resource'.
Из одного контроллера можно вернуть данные другого, только при этом должны совпадать типы возвращаемых данных.
Для этого вложенного контроллера не будет применено ни одно Событие, из назначенных контроллерам.
Кроме копирования демонстрационного файла DefaultController.php и его изменения, есть еще один простой способ создания контроллера с использованием консольной команды.
$php console --add controller ExampleController
Эта команда создаст новый шаблон контроллера /app/Controllers/ExampleController.php.
Можно использовать другое подходящее название для класса.
Фреймворк позволяет также создать собственный шаблон по умолчанию для этой команды.