Skip to content
Anton edited this page Jun 2, 2016 · 26 revisions

Описание

Буковка 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 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();
}