如何仅为PROD环境设置自定义错误页面?我希望显示自定义的用于生产但是普通的用于开发环境的例外。
有什么想法吗?
答案 0 :(得分:7)
我有同样的问题,解决方案非常简单。您必须修改参数twig.exception_listener.contoller
以将错误页面的呈现重定向到您自己的控制器,这可能会扩展原始的Twig异常控制器。
示例(YourBundle/Resources/config/services.xml
):
<parameter key="twig.exception_listener.controller">YourBundle\Controller\ExceptionController::showAction</parameter>
然后你必须使用方法showAction
创建自己的ExceptionController,检查环境并做你想做的事情或将请求传递给parent::showAction()
。
namespace YourBundle\Controller;
use Symfony\Bundle\TwigBundle\Controller\ExceptionController as BaseExceptionController;
use Symfony\Bundle\FrameworkBundle\Templating\TemplateReference;
use Symfony\Component\HttpKernel\Exception\FlattenException;
use Symfony\Component\HttpKernel\Log\DebugLoggerInterface;
use Symfony\Component\HttpFoundation\Response;
class ExceptionController extends BaseExceptionController {
public function showAction(FlattenException $exception, DebugLoggerInterface $logger = null, $format = 'html') {
$kernel = $this->container->get('kernel');
if ($kernel->getEnvironment() == 'prod') {
$request = $this->container->get('request');
$request->setRequestFormat($format);
$templating = $this->container->get('templating');
$code = $exception->getStatusCode();
$template = new TemplateReference('YourBundle', 'Exception', 'errorpage', $format, 'twig');
if ($templating->exists($template)) {
$response = $templating->renderResponse($template, array(
'status_code' => $code,
'message_code' => 'error_' . $code,
'status_text' => Response::$statusTexts[$code],
'requested_url' => $request->getUri(),
));
$response->setStatusCode($code);
$response->headers->replace($exception->getHeaders());
return $response;
}
}
return parent::showAction($exception, $logger, $format);
}
}
请注意errorpage.html.twig中的错误,因为twig处理中的异常不会像往常一样处理。
答案 1 :(得分:0)
如果您不想覆盖异常控制器:
您可以先在
复制整个文件夹(或特定的布局文件)\vendor\symfony\symfony\src\Symfony\Bundle\TwigBundle\Resources\views\
到
\app\Resources\TwigBundle\views
然后自定义每个布局文件中的视图以匹配您的设计。
然后在布局文件中,为每个环境自定义消息,如下所示
{% if app.environment == 'prod' %}
// message for prod
{% else %}
// message for dev
{% endif %}