2012-02-27 95 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 %}