在我对EVENT_RENDER的回调中,我能够为viewModel分配变量。我还想为控制器设置一些变量,但它不起作用
示例:
$sharedEvents->attach('Zend\Mvc\Application', MvcEvent::EVENT_RENDER, function(MvcEvent $e) {
$vars = \Utils\GsInterface::getVariables();
$e->getViewModel()->setVariables($vars);//Set ok
$ctr = $e->getController();
foreach ($vars as $name => $var) {
$ctr->{$name} = $var;//Don't work
}
});
答案 0 :(得分:1)
我打赌你收到错误的钱,因为你试图将变量设置为不是你的控制器的$ctr
,而是null
,因为可能你的$e->getController();
是返回null。
如果您打开警告,您将收到一些类似Creating default object from empty value
或其他一些来自访问空对象的内容。
我认为$e->getController();
并不能完全符合您的要求。可能你应该尝试$e->getTarget();
,但不能在渲染事件中,而是在调度中。这将以两种方式帮助您:
$e->getTarget()
将为您提供实际的Controller对象,因此错误消失。所以,我会用:
$sharedEvents->attach('Zend\Mvc\Application', MvcEvent::EVENT_RENDER, function(MvcEvent $e) {
$vars = \Utils\GsInterface::getVariables();
$e->getViewModel()->setVariables($vars);
});
$sharedEvents->attach('Zend\Mvc\Application', MvcEvent::EVENT_DISPATCH, function(MvcEvent $e) {
$ctr = $e->getTarget();
$vars = \Utils\GsInterface::getVariables();
foreach ($vars as $name => $var) {
$ctr->{$name} = $var;
}
});