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

ZF2: How to pass a variable from the method attached to MvcEvent::EVENT_FINISH to the layout attached in MvcEvent::EVENT_RENDER?

我正在尝试了解 Zend Framework 2 (ZF2)。几天前我买了 Slavey Karadzhov 的书 "Learn ZF2: Learning By Example"。现在我正在阅读它并试图让一些例子起作用。

我卡在60页了,书上的例子很好用,但是我刚才修改的不行。。。为什么?如何解决?

要进入相同的 code/situation,您必须:

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 成为 /module/Debug/Module.php 文件 getMvcDuration 方法中 $duration 的值。

我把方法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 目录中的文件。我知道修改 vendor 目录中的代码不是一件好事,但让这个 post(我的问题)只针对一个问题。

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

综上所述,您不应该从 module.php 向视图模型注入变量。很难测试它。这就是视图助手的用武之地。