Skip to content
Anton edited this page May 21, 2013 · 26 revisions

Описание

Буковка C из MVC, вот только нет для него никакого класса прародителя, всё куда как проще.

Настройки

Нет

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

Для создания своего контроллера (понятие action нет в Bluz) необходимо создать файл с анонимной функцией в директории модуля application/modules/%module%/controllers/%controller%.php:

<?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%/

Обработка входных параметров

Магия - мы можем получать параметры запросов как входящие параметры функции-контроллера:

<?php
return
function ($id, $text) {
    echo $id;
    echo $text;
};

Так же можем явно указать тип входных параметров используя PHPDoc:

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

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

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

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

<?php
return
/**
 * @var closure $bootstrap
 * @var Bluz\Request $request
 * @var Bluz\View $view
 * @return View
 */
function() use ($bootstrap, $request, $view) {
 
};

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

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

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

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

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

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

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

<?php
return
function ()  {
    $this->getLayout()->title("Test", \Bluz\View\View::POS_APPEND);
};

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

<?php
return
function() use ($bootstrap) {
    $bootstrap();
};

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

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

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

Следует запомнить, что кешируется лишь View, следовательно, если вы изменяли Layout внутри контроллера (к примеру устанавливали заголовок), то эти изменения не будут учтены при загрузке из кеша, так что стучитесь в Layout непосредственно из самого шаблона.

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

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

<?php
return
function() {
    // do something
    return false;
};

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

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

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

<?php
return
function() {
    return 'another.phtml';
};

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

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

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

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

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

Clone this wiki locally