我尝试将回调函数传递给模板,该模板应该在模板中调用,但是在参数传递给方法setVariable()后直接调用回调
public function testAction() {
$model = new ViewModel();
$callback = function() {
return new \stdClass();
};
$model->setVariable('call', $callback);
\Zend\Debug\Debug::dump([
get_class($callback),
get_class($model->getVariable('call'))
]);
}
结果有点奇怪:
array(2) {
[0] => string(7) "Closure"
[1] => string(8) "stdClass"
}
我不明白为什么会这样。是这个错误或功能吗?
答案 0 :(得分:2)
视图变量存储为自定义ArrayObject
类Zend\View\Variables
。
调试中的$viewModel->getVariable()
来电将代理offsetGet
方法和will cause the closure to be invoked。
相关代码。
public function offsetGet($key)
{
// ...
$return = parent::offsetGet($key);
// If we have a closure/functor, invoke it, and return its return value
if (is_object($return) && is_callable($return)) {
$return = call_user_func($return);
}
return $return;
}
如果您想要闭包对象,那么您可能需要考虑使用视图助手。