Controller
Описание
Буковка C из MVC, вот только нет для него никакого класса прародителя, всё куда как проще.
Настройки
Нет
Использование
Для создания своего контроллера (понятие action нет в Bluz) необходимо создать файл с анонимной функцией в директории модуля application/modules/%module%/controllers/%controller%.php:
// application/modules/%module%/controllers/%controller%.php // return!!! return function () { };
Директива
returnобязательна, ведь вызываяincludeданного файла мы должны поймать нашу анонимную функцию
Теперь создадим шаблон для view - application/modules/%module%/views/%controller%.phtml:
<!-- application/modules/%module%/views/%controller%.phtml -->
<h2>Hello!</h2>
Всё - URL должен ожить /%module%/%controller%/
Обработка входных параметров
Магия - мы можем получать параметры запросов как входящие параметры функции-контроллера:
return function ($id, $text) { echo $id; echo $text; };
Так же можем явно указать тип входных параметров используя PHPDoc:
/** * @param integer $id * @param string $text */ return function ($id, $text) { // integer echo $id; // string echo $text; };
Undercover
с версии 7.0.0
Класс Controller\Controller отвечает за подключение анонимной функции, и все остальные плюшки описанные в данном разделе руководства.
При запуске контроллера, формируется набор данных Controller\Data, который в дальнейшем попадёт в ответ сервера, в каком виде - за это уже отвечает класс Response.
Из анонимной функции к классу можно обращаться как к $this.
Использование кеширования данных
Для кеширования результирующих данных достаточно в комментариях к контроллеру прописать @cache 5 min - таким образом результирующий Controller\Data будет кешироваться на 5 минут используя в качестве ключа текущие входные параметры (так же поддерживается указание часов (hour/s) и дней (day/s)).
/** * @cache 5 min * @param integer $id */ return function($id) use () { };
Возвращаем данные
Если ваш контроллер вернёт false, то таким образом вы отключите использование шаблонизатора (подобный результат не кешируется):
return function() { // do something return false; };
Если ваш контроллер вернёт массив данных, то система посчитает, что эти данные необходимо занести в Data:
return function() { // do something return ['foo' => 'bar']; };
Если ваш контроллер вернёт строку, до это будет эквивалентно вызову метода setTemplate() для View:
return function() { return 'another.phtml'; };
Возвращаем JSON
с версии 0.9.1
Для автоматического форматирования View в JSON в блоке описания следует указать:
Таким образом, система найдя в заголовках запроса типа Accept: application/json автоматически преобразует вывод в JSON.
Если ваш контроллер должен поддерживать и HTML и JSON:
/** * @accept HTML * @accept JSON */
Controller Helpers
с версии 7.0.0
denied
Бросает исключение ForbiddenException
Синтаксис:
function () { $this->denied(); }
disableLayout
Отключение (Layout)[Layout]
Синтаксис:
function () { $this->disableLayout(); }
disableView
Отключение (View)[View]
Синтаксис:
function () { $this->disableView(); }
dispatch
Вызов другого контроллера:
Синтаксис:
function () { $this->dispatch($module, $controller, $params) ; }
Отдельно стоит заметить, что таким способом можно вызвать контроллер вложенный в подпапку, который иначе нельзя выполнить:
function () { $templateController = $this->dispatch('users', 'mail/template', ['template' => 'recovery']); $htmlResult = $templateController->render(); }
isAllowed
Проверка прав доступа по указанной привилегии в текущем модуле:
Синтаксис:
/** * @acl Delete */ return function () { if (!$this->isAllowed('Delete')) { $this->denied(); } }
useJson
Принудительное переключение вывода в JSON формат:
Синтаксис:
function () { $this->useJson(); }
useLayout
Переключение Layout'а:
Синтаксис:
function () { $this->useLayout('small.phtml'); }
user
Возвращает текущего пользователя, если таковой есть.
Синтаксис:
function () { $this->user(); }