【问题标题】:Zend Framework: Pass by reference to view helper not workingZend Framework:通过引用传递给视图助手不起作用
【发布时间】:2011-12-06 21:41:55
【问题描述】:

这是一个简单的视图助手(注意 pass-by-reference 参数):

class Zend_View_Helper_MyViewHelper extends Zend_View_Helper_Abstract
{
  public function MyViewHelper(&$array)
  {
    unset($array['someExistingKey']);
  }
}

这在视图中不起作用。 $array['someExistingKey'] 仍然设置(除了在方法的直接上下文中)。 Zend 必须做一些事情来防止数组通过引用传入。关于解决方案的任何想法?

【问题讨论】:

    标签: php zend-framework pass-by-reference view-helpers


    【解决方案1】:

    当您从模板调用$this->MyViewHelper($array) 时,您实际上并没有直接调用帮助类,Zend_View 正在实例化该类并为您调用它。因此,我认为您可能无法正常工作。您最好的选择可能是使用 Zend_Registry,或者重构以采用不需要全局的不同方法。

    【讨论】:

    • 这很令人失望,但可以理解。 (顺便说一句,它并不是真正的“全球性”,但我知道你的意思。)
    • 参见 Zend_View_Abstract::_call()。它使用call_user_func_array 来调用你的助手类。见this question
    【解决方案2】:

    我只是想到了一个解决方法。您只需手动调用帮助程序,而不是让 ZF 通过call_user_func_array 调用它。

    Ref.php

    class Zend_View_Helper_Ref extends Zend_View_Helper_Abstract
    {
        public function removeFromRef(&$ref)
        {
            // change your var value here
            unset($ref['key']);
        }
    
        /**
         * ZF calls this for us, but we'll call what we want, so you can skip this.
         */
    //    public function ref()
    //    {}
    }
    

    如您所见,您可以跳过将 main 方法命名为文件名的约定,但我仍然推荐它。 现在,您可以在视图/控制器中传递引用:

    // in view:
    $this->getHelper('Ref')->removeFromRef($someVar2Change);
    // in controller
    $this->view->getHelper('Ref')->removeFromRef($someVar2Change);
    

    基本上,这就是$this->ref() 所做的:获取助手,然后调用call_user_func_array

    虽然有些人在使用 $this->getHelper('Ref')->ref() 而不是 $this->ref() 时可能会遇到问题,但它确实有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-10
      • 1970-01-01
      • 2013-04-09
      • 1970-01-01
      • 1970-01-01
      • 2011-08-30
      相关资源
      最近更新 更多