Neurons to bytes

Загрузка view по-требованию в Zend Framework

Поведение 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> за любезно предоставленный код :)

Also interesting

Tag after , ,


(required)


(required but won't be displayed)