Zend Framework: передача по ссылке для просмотра помощника не работает

Вот простой помощник вида (обратите внимание на аргумент передачи по ссылке):

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

Это не работает в представлении. $array['someExistingKey'] все еще установлен (кроме в пределах непосредственного контекста метода). Zend должен что-то делать, чтобы предотвратить передачу массива по ссылке. Есть идеи по решению?

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()
//    {}
}

Как вы можете видеть, вы можете пропустить соглашение о необходимости называть ваш основной метод именем файла, но я все же рекомендую его. Теперь вы можете передавать ссылки в представлениях / контроллерах:

// 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() хотя, но это работает.

Когда вы звоните $this->MyViewHelper($array) из ваших шаблонов вы на самом деле не вызываете вспомогательный класс напрямую, Zend_View создает экземпляр класса и вызывает его для вас. Поэтому я думаю, у вас могут возникнуть проблемы с этим. Лучше всего, возможно, использовать Zend_Registry или рефакторинг, чтобы использовать другой подход, не требующий глобального подхода.

Другие вопросы по тегам