-
Notifications
You must be signed in to change notification settings - Fork 39
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:
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 в директории модуля:
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
Acl
Application
Auth
Cache
Common
— Exception
— Collection
— Container
— Helper
— Options
— Singleton
Config
Controller
— Data
— Mapper
—— Crud
—— Rest
— Reflection
Crud
— Crud Table
Db
— Row
— Table
— Relations
— Query
Debug
EventManager
Grid
Http
Layout
Logger
Mailer
Messages
Nil
Proxy
Registry
Request
Response
Router
Session
Translator
Validator
View