如何将错误500消息传递给我的错误模板?

时间:2014-02-21 10:54:41

标签: php symfony exception error-handling

使用Syfmony2,我创建了自定义错误模板,在我的情况下是

/app/Resources/TwigBundle/views/Exception/error.html.twig

看起来像这样

<html>
  </body>
    <h1>ERROR {{ status_code }}</h1>
    <p>{{ status_text }}</p>
  </body>
</html>

当我现在抛出错误并带有消息时:

throw new Exception('There is something wrong in the state of Denkmark.');

我希望消息显示在呈现的错误模板上。相反,它只显示标准消息:

  

内部服务器错误

但是,当我在开发模式下运行时,它会显示正确的消息(但在Symfony2标准错误模板上)。为什么隐藏了prod模式中的消息?我是谁写的消息?对于开发日志?

(如何)我可以强制在prod模式下在我的模板上显示消息吗?

2 个答案:

答案 0 :(得分:2)

此行为是正确的,因为Exception可能包含一些“内部”信息,而在生产环境中,则不应显示这些信息。

你可以做的是耗尽404页面或使用你自己的逻辑在发生异常时显示某些东西,但你不能依赖symfony2标准逻辑,因为它与你的

不兼容

对于costumize 404页面,您应该通过在此处放置自己的错误页面来提取默认模板app/Resources/TwigBundle/views/Exception/error404.html.twig

对于你自己的逻辑:只需使用一个event listener/subscriber,它将在一些例外情况下呈现页面

答案 1 :(得分:1)

您将需要创建自定义模板EventListener并注册EventListener:

// src/Acme/DemoBundle/EventListener/AcmeExceptionListener.php 
namespace Acme\DemoBundle\EventListener;

use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface;

class AcmeExceptionListener
{
  public function onKernelException(GetResponseForExceptionEvent $event)
  {
     // You get the exception object from the received event
     $exception = $event->getException();
     $message = sprintf(
         'My Error says: %s with code: %s',
         $exception->getMessage(),
         $exception->getCode()
    );

    // Customize your response object to display the exception details
    $response = new Response();
    $response->setContent($message);

    // HttpExceptionInterface is a special type of exception that
    // holds status code and header details
    if ($exception instanceof HttpExceptionInterface) {
         $response->setStatusCode($exception->getStatusCode());
         $response->headers->replace($exception->getHeaders());
    } else {
         $response->setStatusCode(Response::HTTP_INTERNAL_SERVER_ERROR);
    }

    // Send the modified response object to the event
    $event->setResponse($response);
  }
}

你将需要注册听众:

# app/config/config.yml
services:
    kernel.listener.your_listener_name:
        class: Acme\DemoBundle\EventListener\AcmeExceptionListener
        tags:
            - { name: kernel.event_listener, event: kernel.exception, method:    
onKernelException }

源: http://symfony.com/doc/current/cookbook/service_container/event_listener.html