忽略ZF3 MVC中的默认404路由

时间:2017-03-20 18:03:01

标签: zend-framework-mvc zend-framework3

目前,对于我在RESTFUL Zend Framework 3中的GET端点,如果我找不到用户通过参数请求的项目,我会使用JSON API errors发送400,如下所示:

$this->response->setStatusCode(Response::STATUS_CODE_400);
return JsonModel([
    'errors' => [
        [ 'title' => 'Not found' ]
    ]
]);

当然正确的状态是404.但是,只要我设置$this->response->setStatusCode(Response::STATUS_CODE_404);,就会显示默认的404路线。如何禁用它?

我尝试在module.config.php

中注释掉以下内容
. . .
'view_manager' => [
    // 'display_not_found_reason' => true,
    'display_exceptions'       => true,
    'doctype'                  => 'HTML5',
    // 'not_found_template'       => 'error/404',
    'exception_template'       => 'error/index',
    'strategies' => [
        'ViewJsonStrategy',
    ],
    . . .
],

这有效,除了我有两个问题:

  1. 我喜欢某些终端的404路线
  2. 它将信息添加到我不想发送的返回JSON

    {     "错误":[     {         " title":" Not Found",         }     ]     "消息":"找不到页面。",     " display_exceptions":true,     " controller":"公司\ Module \ Controller \ RestfulController",     " controller_class":null }

  3. 我有什么选择?

1 个答案:

答案 0 :(得分:1)

您的问题是由 Zend \ Mvc \ View \ Http \ RouteNotFoundStrategy 引起的,它是由您的默认视图管理器注册的。您可以在 Zend \ Mvc \ View \ Http \ ViewManager 中看到:

$routeNotFoundStrategy   = $services->get('HttpRouteNotFoundStrategy');

即使您使用' display_exceptions' => false,仍然附加消息。

为了解决这个问题,一种解决方案是将模型内容注入响应并将后者直接返回到您的视图中:

$this->response->setStatusCode(Response::STATUS_CODE_404);
$model = new JsonModel([
        'errors' => [
            [ 'title' => 'Not found' ]
        ]
]);
return $this->getResponse()->setContent($model->serialize());