2013-12-11 4 views
1

Я хочу, чтобы мой контроллер возвращает ответ 404, когда модель не найдена, и я хочу, чтобы указать пользовательское сообщение, а не по умолчанию «The requested controller was unable to dispatch the request.»Zend Framework 2: установить причины фраза для ошибки 404

Я попытался указав 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', 
    )); 
} 

Спасибо.

+0

"Запрошенный контроллер не смог направить запрос." возвращается не найденным обработчиком страницы, а не вашим контроллером. – imel96

+0

См. Шаблон 404. Если вы используете модуль приложения, см. Приложение/view/error/404.phtml switch ($ this-> reason) {...} –

+0

@ dphn, да, дело в том, что я задал причину в контроллере, и она становится переопределенной между фазой рендеринга. –

ответ

3

Похоже, вы путаете reasponphrase и переменную reason, переданную в представление. Призрак является частью кода статуса http, например «Не найден» для 404. Вероятно, вы не хотите его изменять.

Как @dphn говорит, я бы рекомендовал бросить ваше собственное Исключение и приложить слушателя к 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', 
), 
+0

Работает как очарование! –