使用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模式下在我的模板上显示消息吗?
答案 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