仅适用于PROD环境的自定义错误页面?

Dav*_*idW 2 symfony

如何仅为PROD环境设置自定义错误页面?我希望显示自定义的用于生产但是普通的用于开发环境的例外.

有任何想法吗?

小智 7

我有同样的问题,解决方案非常简单.您必须修改参数twig.exception_listener.contoller以将错误页面的呈现重定向到您自己的控制器,这可能会扩展原始的Twig异常控制器.

示例(YourBundle/Resources/config/services.xml):

<parameter key="twig.exception_listener.controller">YourBundle\Controller\ExceptionController::showAction</parameter>
Run Code Online (Sandbox Code Playgroud)

然后,您必须使用方法创建自己的ExceptionController showAction,检查环境并执行您要执行的操作或将请求传递给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);
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意errorpage.html.twig中的错误,因为twig处理中的异常不会像往常一样处理.