Zend:do 操作助手的 init 方法将变量传递给布局视图


Zend:does action helper's init method passes variables to layout view?

问题:我无法将变量从操作助手的 init 方法传递到我的自定义布局。

我有这个操作助手"My_Action_Helper_Initializer":

class My_Action_Helper_Initializer extends Zend_Controller_Action_Helper_Abstract
{
 public function init()
 {
  $controller=$this->getActionController();
  //variable passed to controller's view
  $controller->view->flop="FLOOP!!";
  //variable passed to controller
  $controller->boom="BOOM!!";
 }
}

在我的控制器"索引控制器"中:

class IndexController extends Zend_Controller_Action
{ 
  public function indexAction()
  {
    //print the variable passed from action helper
    echo $this->boom;
  }
}   

然后在我的"layout.phtml"中:

//print variable passed from action helper
echo $this->flop;
  • 因此,控制器动作回显的"繁荣"变量正确显示。

  • "flop"变量(传递给我的布局)未显示。

    问:为什么传递给控制器操作的变量正确输出,而传递给布局视图的另一个变量却没有?

谢谢

卢卡

当助手的 init() 调用时,ViewRenderer 的 init() 还没有。这是因为帮助程序堆栈中的顺序。

如果启用严格标准错误报告,则应在帮助程序"从 ..." 中的空值创建默认对象"中看到类似以下内容

您应该考虑将代码移动到 preDispatch() 钩子,因为 init() 方法应该用于帮助程序初始化。

获取控制器的视图实例:

function getView()
{
    $controller = $this->getActionController();
    if($view = $controller->view) {
        return $view;
    }
    if($this->getFrontController()->getParam('noViewRenderer') {
        return $controller->initView();//this view instance will not be used in Zend_Layout!
    }
    $vr = Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
    return $vr->initView();      
}

如果要将参数传递给布局,请使用

$view = Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer')->initView();

之所以这样称呼操作帮助程序,是因为它们是避免操作中代码重复的一种方法。在操作帮助程序中执行的所有操作都可用于操作,但不适用于视图。这是操作的正常行为,只要你不向视图传递某些内容,视图就不知道它。如果要避免视图中的代码重复,请创建视图帮助程序。

有时,创建操作帮助程序和相应的视图帮助程序是有意义的。

--

preDispatch works() 而 init() 则不工作,因为使用 init 你实际上并没有挂接到调度过程。