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 или рефакторинг, чтобы использовать другой подход, не требующий глобального подхода.