无法在Zend Framework中设置postDispatch()中的视图变量
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无法在Zend Framework中设置postDispatch()中的视图变量相关的知识,希望对你有一定的参考价值。
我们有一个插件,它有一个postDispatch挂钩,用于记录使用ZF1开发的CMS上的使用情况统计信息。在生成其中一条记录之后,我们需要为视图获取它的唯一ID,以便能够通过AJAX请求更新它。
几个帖子提供了不同的方法来设置postDispatch函数中的视图变量,但它们都没有为我们工作。他们都在preDispatch面团上工作。
this answer的方法1适用于preDispatch,但不适用于postDispatch。
$view = Zend_Controller_Front::getInstance()
->getParam('bootstrap')
->getResource('view');
$view->recordUID = XXXXXX
method 2也是如此
$viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
if (null === $viewRenderer->view) {
$viewRenderer->initView();
}
$view = $viewRenderer->view;
$view->recordUID = XXXXXX
另一个用户在别处建议(现在找不到参考)使用Zend's registry,它也适用于preDispatch但不适用于postDispatch
Zend_Registry::set('recordUID', 'XXXXXX');
在调度请求后,视图对象似乎丢失了。
附加信息
- 该视图在Bootstrap.php(required for method 1)中初始化
- 该插件在public index.php中注册
- 注册统计信息的方法使用postDispatch函数运行
答案
调用插件的postDispatch()方法时,视图已经呈现。
我遇到了同样的问题,所以我将代码放入控制器的postDispatch()中(您还可以创建一个扩展Zend_Controller_Action的基本控制器,在那里覆盖preDispatch和postDispatch,让所有控制器扩展基本控制器)。不使用
$this->render('script');
在控制器内部,而是
$this->_helper->viewRenderer('script');
如果需要的话。
这里有一个答案link提供解决方法:
class App_Plugin_MyPlugin extends Zend_Controller_Plugin_Abstract{
public function preDispatch (Zend_Controller_Request_Abstract $request){
$viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
$viewRenderer->setNeverRender(true);
}
public function postDispatch(Zend_Controller_Request_Abstract $request){
$viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
$view = $viewRenderer->view;
$view->variable = 'new value';
$viewRenderer->render();
}
}
以上是关于无法在Zend Framework中设置postDispatch()中的视图变量的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Zend Framework 2 中设置第一个应用程序