我正在使用Zend Framework 2中的RESTful API。我使用AbstractRestfulController
来处理请求。在那个控制器中,我想直接返回一个数组或对象(自定义模型类),而不是JsonModel
。那些东西以及将结果转换为数组(作为JSON编码的准备)应该会在以后自动发生。
我试图抓住MvcEvent::EVENT_DISPATCH
事件来操纵$e->getResult()
值但是当我在控制器中返回一个关联数组时,我在结果中得到一个ViewModel而不是传入的普通数据通过控制器方法。
我尝试通过实施ListenerAggregateInterface
类来创建自定义视图策略。在ViewEvent::EVENT_RESPONSE
事件catch中,我转储了$e->getResult()
值并获得了已编码的结果。在这里,我需要简单的结果来准备编码。
在编码为JSON之前,我可以在哪里操作控制器的普通返回值? ZF2通常在哪里操纵MVC生命周期中的返回值?
提前谢谢!
答案 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。