ZF2:如何将附加到MvcEvent :: EVENT_FINISH的方法中的变量传递给MvcEvent :: EVENT_RENDER中附加的布局?

时间:2015-01-11 13:07:00

标签: zend-framework2

我想了解Zend Framework 2(ZF2)。几天前我买了这本书"学习ZF2:通过实例学习"作者:Slavey Karadzhov。现在我正在阅读它并试图让一些例子正常工作。

我陷入了第60页。本书中显示的示例效果很好,但我刚刚做的修改不起作用......为什么?如何解决?

要进入相同的代码/情况,您需要:

git clone https://github.com/slaff/learnzf2 .

composer.phar self-update
composer.phar install

git stash
git checkout 'ch-view'

之后您将拥有与我相同的设置。

现在我已经改变了文件/module/Debug/view/debug/layout/sidebar.phtml:

<h1>Top Line</h1>
<?= $this->content ?>

<h1>Bottom Line</h1>

到此(最后只添加了一行):

<h1>Top Line</h1>
<?= $this->content ?>

<h1>Bottom Line</h1>
<p>MVC duration: <?= $this->mvcDuration ?></p>

我希望$this->mvcDuration成为$duration文件/module/Debug/Module.php方法中getMvcDuration的值。

我改变了方法getMvcDuration的内容:

public function getMvcDuration(MvcEvent $event)
    {
        // Here we get the service manager
        $serviceManager = $event->getApplication()->getServiceManager();
        // Get the already created instance of our timer service
        $timer = $serviceManager->get('timer');
        $duration = $timer->stop('mvc-execution');
        // and finally print the duration
        error_log("MVC Duration:".$duration." seconds");
    }

到此(在方法结尾添加两行):

public function getMvcDuration(MvcEvent $event)
    {
        // Here we get the service manager
        $serviceManager = $event->getApplication()->getServiceManager();
        // Get the already created instance of our timer service
        $timer = $serviceManager->get('timer');
        $duration = $timer->stop('mvc-execution');
        // and finally print the duration
        error_log("MVC Duration:".$duration." seconds");

        $viewModel = $event->getViewModel();
        $viewModel->setVariable('mvcDuration', $duration);

    }

但是,这种更改不起作用,$duration的值不会传递给布局。问题是为什么?如何将$duration传递给布局的$this->mvcDuration

P.S。从官方github repo(https://github.com/slaff/learnzf2)下载的代码非常奇怪......更改项目文件(例如:/module/Debug/view/debug/layout/sidebar.phtml)不会改变输出。如果您在尝试帮助我解决此案例时遇到相同的情况,那么我建议您修改/vendor/learnzf2目录中的文件而不是/module目录中的文件。我知道修改供应商目录中的代码并不是一件好事,但是让这篇文章(我的问题)只关注一个问题。

1 个答案:

答案 0 :(得分:0)

好书。您的基本问题是您正在尝试将视图中的变量更新到视图已被发送后触发的方法中。除非你重新定义哪个事件会触发它,否则你可能无法做到这一点,但这会破坏计时整个mvc持续时间的预期目的。

所有这一切,你不应该从module.php向视图模型中注入变量。很难对此进行测试。这就是助手的好处。