2012-02-27 100 views
2

如何为PROD环境设置自定义错误页面?我想为生产展示自定义生产,但是对于开发环境却有例外情况。仅适用于PROD环境的自定义错误页面?

任何想法?

+1

你需要的是INT食谱(DEV异常页面仍然是相同的,它不仅影响PROD环境):HTTP:/ /symfony.com/doc/current/cookbook/controller/error_pages.html – AlterPHP 2012-02-28 04:56:44

回答

6

我有同样的问题,解决方案很简单。您必须修改参数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中的错误,因为在小枝处理中的例外情况不会像平常那样处理。

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 %}