ZF2:控制器返回/结果在哪里被MVC操纵



我正在开发Zend Framework 2中的RESTful API。我使用AbstractRestfulController来处理请求。在该控制器中,我想直接返回一个数组或对象(自定义模型类),而不是JsonModel。这些东西和结果到数组的转换(作为JSON编码的准备)应该在以后自动发生。

  • 我试图捕捉MvcEvent::EVENT_DISPATCH事件来操纵$e->getResult()值,但当我在控制器中返回一个关联数组时,我在结果中得到一个ViewModel,而不是控制器方法传递的普通数据。

  • 我试图通过实现ListenerAggregateInterface类创建一个自定义视图策略。在ViewEvent::EVENT_RESPONSE事件捕获中,我转储了$e->getResult()值并获得了已经编码的结果。同样在这里,我需要简单的结果来准备编码。

在编码到JSON之前,我可以在哪里挂钩来操纵控制器的普通返回值?在哪里ZF2一般操纵在MVC生命周期的返回值?

提前感谢!

我没有那么多时间来调查这个问题,但我的猜测是,当您将侦听器附加到MvcEvent::EVENT_DISPATCH时,可能会忽略停止事件传播。因此,您设置为事件结果的内容可能会在稍后的分派过程中被重写。

尝试用更高的优先级附加回调并停止传播($e->stopPropagation()从回调),因为事件管理器不会自己停止传播,直到一个或另一个回调返回ZendStdLibResponseInterface对象。

无论如何,我知道您可能有很好的理由试图以这种方式"破解"调度过程,但我倾向于认为可能有更好的理由来调整您的代码以适应默认过程;)

在这里,如果在结果中检测到关联数组,则zf2创建ViewModel,注册优先级为-80。根据本文档页面,这是第一个事件捕获更改控制器返回的结果。

我做错的是将我的MvcEvent::EVENT_DISPATCH附加到$application->getEventManager()而不是$application->getEventManager()->getSharedManager()(像zf2一样)。我还不明白有什么区别,但它是有效的。

下面是我如何在onBootstrap方法中注册事件:

$application->getEventManager()->getSharedManager()->attach(
    __NAMESPACE__,
    MvcEvent::EVENT_DISPATCH,
    array($this, 'createJsonModelFromResult'),
    -10
    // priority of -10 because at priority 1 the mvc
    //  runs the actual controller method
);

createJsonModelFromResult方法的末尾,我还添加了$e->stopPropagation();,因为我们已经找到了匹配的ViewModel

现在$e->getResult()值与我的控制器动作中返回的值完全相同,我可以为JSON编码做好准备。太酷了!

我不知道你想如何返回一个数组或对象。通常人们制作一个DTO(数据传输对象),序列化它,然后发送它。在此方法中,最后的DTO转换为JSON。

你想用什么格式来回应?字符串(序列化DTO)、XML还是其他东西?你可以创建一个类来扩展ViewModel,并序列化你的数组。

无论如何,您不需要获取MVC_EVENT.

最新更新