setTerminal删除内容而不是布局

时间:2014-05-13 18:24:01

标签: zend-framework2

嗨,我有一个zf2应用程序。 在我的模块中,我将一个监听器附加到MvcEvent::EVENT_DISPATCH事件。 在这个监听器中,我检查用户是否经过身份验证等。 如果用户通过身份验证,我将更改布局。

现在如果我在我的操作中调用$viewModel->setTerminal(true)没有显示内容,只显示布局,但我需要反过来。

https://stackoverflow.com/a/21441607/1594076 这个答案在某种程度上解释了我的错误,但这对我来说并不是很清楚。 此外,提供的解决方案在我的情况下不起作用,因为我必须将2个方法添加到我的所有控制器。

有解决方案的人吗?

由于

1 个答案:

答案 0 :(得分:1)

在布局侦听器中,您需要应用一些条件逻辑来确定控制器返回的视图模型在设置布局之前是否为终端。

这可以通过从您的监听器中的MvcEvent获取结果并检查它是ViewModel

terminate()实例来完成
public function yourLayoutListenerCallback(MvcEvent $e)
{
    // get the dispatched result from the event 
    $result = $e->getResult();
    // check it's a view model that doesn't terminate 
    if (!$result instanceof \Zend\View\Model\ViewModel || $result->terminate()) {
        // do nothing
        return;
    }
    // your existing layout logic ....
}

注意:您需要确保您的布局侦听器具有足够低的优先级(> = -10似乎足够),以便您的控制器操作在测试条件之前实际返回了视图模型。