-
Notifications
You must be signed in to change notification settings - Fork 39
Controller
Буковка 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 в директории модуля:
<?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
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