Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php ZF2:MVC在哪里操纵控制器返回/结果?_Php_Json_Api_Zend Framework_Zend Framework2 - Fatal编程技术网

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

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,而不是控制器方法传入的普通

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

  • 我试图捕获
    MvcEvent::EVENT\u DISPATCH
    事件来操作
    $e->getResult()
    值,但是当我在控制器中返回关联数组时,我在结果中得到了一个ViewModel,而不是控制器方法传入的普通数据

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

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


提前谢谢你

我不知道如何返回数组或对象。通常人们制作一个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
进行连接。可能您应该创建自己的控制器插件。用于收集有关操作的数据。如果你不想在行动中反应,不要返回任何东西,并将数据传递给插件。你认为这是一个“黑客”吗?有没有更合适的解决方案?