Php ZF2:MVC在哪里操纵控制器返回/结果?
我正在Zend Framework 2中开发RESTful API。我使用Php ZF2:MVC在哪里操纵控制器返回/结果?,php,json,api,zend-framework,zend-framework2,Php,Json,Api,Zend Framework,Zend Framework2,我正在Zend Framework 2中开发RESTful API。我使用AbstractRestfulController来处理请求。在该控制器中,我希望直接返回一个数组或对象(自定义模型类),而不是JsonModel。这些东西和结果到数组的转换(作为JSON编码的准备)应该稍后自动进行 我试图捕获MvcEvent::EVENT\u DISPATCH事件来操作$e->getResult()值,但是当我在控制器中返回关联数组时,我在结果中得到了一个ViewModel,而不是控制器方法传入的普通
AbstractRestfulController
来处理请求。在该控制器中,我希望直接返回一个数组或对象(自定义模型类),而不是JsonModel
。这些东西和结果到数组的转换(作为JSON编码的准备)应该稍后自动进行
- 我试图捕获
事件来操作MvcEvent::EVENT\u DISPATCH
值,但是当我在控制器中返回关联数组时,我在结果中得到了一个ViewModel,而不是控制器方法传入的普通数据$e->getResult()
- 我试图通过实现
类来创建自定义视图策略。在ListenerAggregateInterface
事件捕获中,我转储了ViewEvent::EVENT\u RESPONSE
值,得到了已经编码的结果。同样在这里,我需要简单的结果来准备编码$e->getResult()
提前谢谢你 我不知道如何返回数组或对象。通常人们制作一个DTO(数据传输对象),序列化它,然后发送它。在这个方法中,最后的DTO转换成JSON 您希望使用什么格式作为响应?字符串(序列化DTO)、XML还是其他?您可以创建一个扩展ViewModel的类,并为您的格式序列化数组
无论如何,您不需要获取MVC_事件。我没有太多时间来研究这个问题,但我猜想,当您将侦听器连接到MvcEvent::EVENT_DISPATCH时,您可能会忽略停止事件传播。因此,您设置为事件结果的内容可能会在稍后的分派过程中被覆盖 尝试以更高的优先级附加回调并停止传播($e->stopPropagation()),因为只有在一个或另一个回调返回Zend\StdLib\ResponseInterface对象时,事件管理器才会自行停止传播 无论如何,我知道您可能有很好的理由尝试以这种方式“黑客”分派过程,但我倾向于认为可能有更好的理由调整您的代码以适应默认过程;) ,zf2创建一个
视图模型
,以防在结果中检测到assoc数组,并以优先级-80注册。根据这是更改控制器返回的结果的第一个事件捕获
我做错的是将我的MvcEvent::EVENT\u DISPATCH
附加到$application->getEventManager()
而不是$application->getEventManager()->getSharedManager()
()。我还不明白区别是什么,但它是有效的
下面是我如何在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编码做好准备。酷 我想从反复出现的控制器中取出代码。因为控制器中的每个操作都以对象数组或单个对象的形式返回数据,所以我希望稍后将结果转换为数组,并将编码准备为JSON。因此,我想在发送请求后使用MvcEvent
进行连接。可能您应该创建自己的控制器插件。用于收集有关操作的数据。如果你不想在行动中反应,不要返回任何东西,并将数据传递给插件。你认为这是一个“黑客”吗?有没有更合适的解决方案?