我正在开发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.