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

时间:2014-03-15 23:05:42

标签: php json api zend-framework zend-framework2

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

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

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

在编码为JSON之前,我可以在哪里操作控制器的普通返回值? ZF2通常在哪里操纵MVC生命周期中的返回值?

提前谢谢!

3 个答案:

答案 0 :(得分:1)

我没有太多时间在此问题上进行调查,但我的猜测是,当您将侦听器附加到MvcEvent :: EVENT_DISPATCH时,可能会忽略停止事件传播。因此,您在事件结果中设置的内容可能会在调度过程中稍后被覆盖。

尝试以较高优先级附加回调并停止传播($ e-> stopPropagation()来自回调),因为事件管理器不会自行停止传播,直到一个或另一个回调为止返回Zend \ StdLib \ ResponseInterface对象。

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

答案 1 :(得分:1)

Here,如果在结果中检测到关联数组,则zf2创建ViewModel,优先级为-80。根据{{​​3}},这是第一个事件catch更改控制器返回的结果。

我做错了是将MvcEvent::EVENT_DISPATCH附加到$application->getEventManager()而不是$application->getEventManager()->getSharedManager()this documentation page)。我不明白它的区别是什么,但它确实有效。

以下是我在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编码做好准备。酷!

答案 2 :(得分:0)

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

您希望在响应中使用哪种格式?字符串(序列化DTO),XML还是其他什么?您可以创建一个扩展ViewModel的类,并为您的格式序列化数组。

无论如何,你不需要获得MVC_EVENT。