Zend Framework 1.x可以禁用整个模块上的布局和渲染吗?


Can Zend Framework 1.x disable layouts and rendering on an entire module?

我有一个名为api的模块,我想完全禁用所有渲染和布局,只返回JSON。我知道我可以像这样在控制器中禁用每个操作的布局:

$this->_helper->_layout->disableLayout();
$this->_helper->viewRenderer->setNoRender(TRUE);

但是我怎样才能在整个api模块上做到这一点呢?


溶液:把它放在它自己的控制器中,并让所有其他控制器扩展它:

public function preDispatch() {
        $this->_helper->layout()->disableLayout(); 
        $this->_helper->viewRenderer->setNoRender(true);
    }
class My_Controller_Action extends Zend_Controller_Action
{
    public function init()
    {
        $this->_helper->_layout->disableLayout();
        $this->_helper->viewRenderer->setNoRender(TRUE);
    }
}
class Api_IndexController extends My_Controller_Action
{
     public function viewAction()
     {
        // data to return
        $data = array();
        $this->_helper->json($data);
     }
}

创建插件并添加preDispatch()方法,如下所示:

public function preDispatch(Zend_Controller_Request_Abstract $request)
    if ($request->getModuleName() === 'messages') {
        Zend_Layout::getMvcInstance()->disableLayout();
        Zend_Controller_Action_HelperBroker::getExistingHelper('viewRenderer')->setNeverRender(true);
    }

从现在开始,模块"消息"将禁用布局和视图。

也许你可以用你的代码创建一个父控制器,你的所有模块控制器都将扩展。