Zend Framework 2:为错误404设置原因短语

时间:2013-12-11 20:04:21

标签: php http-headers zend-framework2 http-status-code-404

我希望我的控制器在找不到模型时返回404响应,并且我想指定自定义消息,而不是默认的“The requested controller was unable to dispatch the request.

我尝试在reason中指定ViewModel,从响应对象设置reasonPhrase ......似乎没有任何效果。我目前正在调查如何防止默认行为,但如果有人在我做之前知道,那就太好了。 (也许有一种比我无论如何都要好的方式。)

这是我所拥有的,但不起作用:

 $userModel = $this->getUserModel();
 if (empty($userModel)) {
     $this->response->setStatusCode(404);
     $this->response->setReasonPhrase('error-user-not-found');
     return new ViewModel(array(
         'content' => 'User not found',
     ));
 }

感谢。

1 个答案:

答案 0 :(得分:4)

看起来你混淆了reasponphrase和传递给视图的原因变量。 reasonphrase是http状态代码的一部分,如404的“Not Found”。你可能不想改变它。

就像@dphn所说的那样,我建议你自己抛出一个Exception并在MvcEvent::EVENT_DISPATCH_ERROR附加一个监听器来决定响应什么。

为了帮助您入门:

控制器

public function someAction()
{
    throw new \Application\Exception\MyUserNotFoundException('This user does not exist');
}

模块

public function onBootstrap(MvcEvent $e)
{
    $events = $e->getApplication()->getEventManager();

    $events->attach(
        MvcEvent::EVENT_DISPATCH_ERROR,
        function(MvcEvent $e) {
            $exception = $e->getParam('exception');
            if (! $exception instanceof \Application\Exception\MyUserNotFoundException) {
                return;
            }

            $model = new ViewModel(array(
                'message' => $exception->getMessage(),
                'reason' => 'error-user-not-found',
                'exception' => $exception,
            ));
            $model->setTemplate('error/application_error');
            $e->getViewModel()->addChild($model);

            $response = $e->getResponse();
            $response->setStatusCode(404);

            $e->stopPropagation();

            return $model;
        },
        100
    );
}

错误/ application_error.phtml

<h1><?php echo 'A ' . $this->exception->getStatusCode() . ' error occurred ?></h1>
<h2><?php echo $this->message ?></h2>  
<?php
switch ($this->reason) {
    case 'error-user-not-found':
      $reasonMessage = 'User not found';
      break;
}
echo $reasonMessage;

module.config.php

'view_manager' => array(
    'error/application_error' => __DIR__ . '/../view/error/application_error.phtml',
),