在对象上调用__invoke()时遇到问题。 __invoke()方法与实例变量无关吗?我需要直接在我的模板上调用__invoke(),因为有些ZF2注入调用$ this-> getView() - > render(...)(否则getView()返回null)我希望有实例变量在那里设定。任何解决方法?
请参阅我的代码:
namespace Person\Person\View\Helper;
use Zend\View\Helper\AbstractHelper;
class PersonShowWidget extends AbstractHelper
{
protected $model = null;
public function __construct(array $options = null)
{
$this->parseOptions($options);
}
public function __invoke()
{
var_dump($this->model); //returns null
return $this->getView()->render('person/show/show_widget', array(
'title' => 'Cliente',
'model' => $this->model,
)
);
}
public function setOptions(array $options = null)
{
$this->parseOptions($options);
}
protected function parseOptions(array $options = null)
{
if (!is_null($options) && is_array($options)) {
if (isset($options['model'])) {
$model = $options['model'];
if (isset($model['id'])) {
$this->model['id'] = $model['id'];
} else {
throw new \Exception;
}
if (isset($model['form'])) {
$this->model['form'] = $model['form'];
} else {
throw new \Exception;
}
}
}
var_dump($this->model); //returns valid data
}
}
在调用__invoke()之前,我确实使用了一些选项或setOptions方法调用了构造函数。
谢谢,
答案 0 :(得分:1)
您必须使用工厂初始化视图助手。通过这种方式,您可以确保在调用__invoke方法之前调用构造函数。并且没有.._invoke()方法与实例变量无关。
在Module.php中
public function getViewHelperConfig()
{
return array(
'factories' => array(
'personShowWidget' => function ($helpers) {
$array = array();
$helper = new Person\Person\View\Helper\PersonShowWidget($array);
return $helper;
},
)
);
}
或者在module.config.php
中'view_helpers' => array
(
'factories' => array(
'personShowWidget' => function ($helpers) {
$array = array();
$helper = new Person\Person\View\Helper\PersonShowWidget($array);
return $helper;
},
)
)
性能方面,您最好使用Factory类而不是可调用类。 更多信息:http://framework.zend.com/manual/2.0/en/modules/zend.module-manager.module-manager.html
编辑:
您似乎错误地使用了ViewHelper。您不必自己创建实例。只需在视图中使用ViewHelper即可。那么为什么不将$options
作为参数提供给__invoke
方法?
public function __invoke(array $options = null)
{
$this->setOptions($options);
return $this->getView()->render('person/show/show_widget', array(
'title' => 'Cliente',
'model' => $this->model,
)
);
}
在Controller中将options数组传递给视图:
return array(
'options' => $options,
);
在视图中调用ViewHelper:
<?php echo $this->personShowWidget($this->options); ?>
请记住:通过这种方式,您不需要工厂来启动ViewHelper。只需将其添加到invokables即可。
module.config.php示例:
'view_helpers' => array(
'invokables' => array(
'personShowWidget' => 'Person\Person\View\Helper\PersonShowWidget',
),
),