Загрузка view по-требованию в Zend Framework
07/07/2009 15:18
Поведение ZF по-умолчанию мне не очень нравится - он всегда загружает шаблон вида. То есть для каждого действия в контроллере обязательно должен быть шаблон вида.
Но шаблон часто не требуется - например, когда отдаете данные из действия в JSON, или не отдаете вообще ничего. В этом случае вам приходится отключать рендеринг вида при помощи
$this->_helper->viewRenderer->setNoRender(true);
Но так делать не удобно, если у вас много действий, где шаблон вида не нужен. Давайте пойдём по пути Rails :). Мы сделаем так, чтобы шаблон вида загружался только в том случае, если он существует. Для этого напишем помощник действия (action helper):
// Coded by lcf http://lcf.name/
class Project_Controller_Action_Helper_Template extends Zend_Controller_Action_Helper_Abstract
{
public function postDispatch()
{
// Get ViewRender instance
$viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
// Specifies script name for the current action
$name = $viewRenderer->getViewScript();
// Get list of script paths which were this script will be matched
$paths = $viewRenderer->view->getScriptPaths();
// Set shouldRender flag to false (disable autorendering)
$shouldRender = false;
// Check all paths in cycle
foreach ($paths as $dir) {
if (is_readable($dir . $name)) {
// Set flag in true if file exists
$shouldRender = true;
}
}
// On the shouldRender flag final value turn off or turn on the rendering
if ($shouldRender) {
$viewRenderer->setNoRender(false);
} else {
$viewRenderer->setNoRender(true);
}
}
}
Класс помощника готов. Теперь нужно зарегистрировать наш класс в брокере помощников (делайте это в вашем Bootstrap файле):
Zend_Controller_Action_HelperBroker::getStack()
->offsetSet(90, new Project_Controller_Action_Helper_Template());
Таким образом, мы сделали Action helper, который срабатывает до запуска viewRenderer’а, но после диспетчеризации действия и сообщает viewRenderer’у, нужно ли рендерить шаблон вида или нет.
Спасибо lcf <http://lcf.name> за любезно предоставленный код :)