【问题标题】:Set variables to controller in MvcEvent::EVENT_RENDER在 MvcEvent::EVENT_RENDER 中将变量设置为控制器
【发布时间】:2014-01-02 14:05:10
【问题描述】:

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

【问题讨论】:

  • 你能解释一下“不工作”吗?您是否有错误或在控制器类上无法访问变量?

标签: php zend-framework2 variable-assignment


【解决方案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; 
         }
    });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-04
    • 1970-01-01
    • 1970-01-01
    • 2018-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多