在MvcEvent :: EVENT_RENDER中将变量设置为控制器

时间:2014-01-02 14:05:10

标签: php zend-framework2 variable-assignment

在我对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
        }
    });

1 个答案:

答案 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; 
         }
    });