Skip to content
AntonShevchuk edited this page Oct 6, 2014 · 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:

return
/**
 * @param integer $id
 * @param string $text
 */
function ($id, $text) {
    // integer
    echo $id;
    // string
    echo $text;
};

Обратите внимание: блок комментариев идёт после директивы return

Использование пакетов приложения

Вспоминаем о замыканиях и конструкции use и используем ее для работы с пакетами приложения:

return
/**
 * @var closure $bootstrap
 * @var Bluz\View\View $view
 * @return void
 */
function() use ($bootstrap, $view) {
 
};

Используем только то, что нам надо, хотя практически все из перечисленного можно получить из объекта $this, что по сути есть Application (спасибо PHP 5.4 за эту возможность)

Использование bootstrap.php

Отдельно стоит упомянуть о возможности создания анонимной функции, которой смогут воспользоваться все контроллеры внутри модуля, для этого лишь стоит создать оную в файле bootstrap.php в директории модуля:

return
/**
 * @return \closure
 */
function($a) {
    /* @var Bluz\Application $this */
    return $a*2;
}; 

А затем «замкнуть» её внутри контроллера

return
function() use ($bootstrap, $view) {
    $view->result = $bootstrap(2);
};

Одно из возможных применений данной функции - манипуляции над Layout'ом:

return
function ()  {
    Layout::title("Test", \Bluz\View\View::POS_APPEND);
};

Вызов в контроллере:

return
function() use ($bootstrap) {
    $bootstrap();
};

Использование кеширования для вывода

Для кеширования вывода достаточно в комментариях к контроллеру прописать @cache 5 min - таким образом результирующий View будет кешироваться на 5 минут используя в качестве ключа текущие входные параметры (так же поддерживается указание часов (hour/s) и дней (day/s)).

return
/**
 * @param integer $id
 * @cache 5 min
 */
function($id) use () {
 
};

Так же есть возможность кешировать вывод как готовый HTML, для этого необходимо использовать комментарий @cache-html 5 min:

return
/**
 * @param integer $id
 * @cache-html 5 min
 */
function($id) use () {
 
};

Следует запомнить, что когда вы кешируете в HTML используя @cache-html, то код контроллера не будет выполнен, и если вы вызываете какие-либо методы Layout то они не будут выполняться.

Возвращаем данные

Если ваш контроллер вернёт false, то таким образом вы отключите использование шаблонизатора (подобный результат не кешируется):

return
function() {
    // do something
    return false;
};

Если ваш контроллер вернёт массив данных, то система посчитает, что эти данные необходимо занести во View:

return
function() {
    // do something
    return ['foo' => 'bar'];
};

Если ваш контроллер вернёт строку, до это будет эквивалентно вызову метода setTemplate() для View:

return
function() {
    return 'another.phtml';
};

Если ваш контроллер вернёт анонимную функцию, то она будет вызвана взамен использования шаблонизатора, результат не кешируется:

return
function() {
    // do something
    return function() {
        echo 'foo';
    };
};

Учтите, данная функция будет вызвана ДО вывода Layout'а

Данную фичу лучше всего использовать совместно с методом dispatch() в шаблонах других контроллеров, как альтернативу использования widget'ов. Ну или как контроллер для AJAX запросов.

Вернув пустую функцию вы фактически отключаете view для данного контроллера, оставляя при этом layout

Clone this wiki locally