2013-01-11 65 views

回答

10

你需要做的不是太難。 Symfony允許您明確指定哪個控制器處理您的異常。所以,在你config.yml,你可以在你的樹枝配置指定例外控制器:

因爲Symfony的2.2

twig: 
    exception_controller: my.twig.controller.exception:showAction 

services: 
    my.twig.controller.exception: 
     class: AcmeDemoBundle\Controller\ExceptionController 
     arguments: [@twig, %kernel.debug%] 

高達2.1的Symfony:

twig: 
    exception_controller: AcmeDemoBundle\Controller\ExceptionController::showAction 

然後你就可以創建一個自定義showAction,顯示基於路線的自定義錯誤頁面:

<?php 
namespace AcmeDemoBundle\Controller; 

use Symfony\Component\HttpKernel\Exception\FlattenException; 
use Symfony\Component\HttpKernel\Log\DebugLoggerInterface; 
use Symfony\Component\HttpFoundation\Response; 
use Symfony\Bundle\TwigBundle\Controller\ExceptionController as BaseExceptionController; 

class ExceptionController extends BaseExceptionController 
{ 
    public function showAction(FlattenException $exception, DebugLoggerInterface $logger = null, $format = 'html') 
    { 
     if ($this->container->get('request')->get('_route') == "abcRoute") { 
      $appTemplate = "backend"; 
     } else { 
      $appTemplate = "frontend"; 
     } 

     $template = $this->container->get('kernel')->isDebug() ? 'exception' : 'error'; 
     $code = $exception->getStatusCode(); 

     return $this->container->get('templating')->renderResponse(
      'AcmeDemoBundle:Exception:' . $appTemplate . '_' . $template . '.html.twig', 
      array(
       'status_code' => $code, 
       'status_text' => Response::$statusTexts[$code], 
       'exception'  => $exception, 
       'logger'   => null, 
       'currentContent' => '', 
      ) 
     ); 
    } 
} 

Ob很明顯你應該自定義if語句來測試當前的路線以適應你的需求,但是這應該做到這一點。

如果您沒有創建特定的錯誤模板,您可能需要添加默認爲普通Twig錯誤頁面的代碼。欲瞭解更多信息,請查看代碼

Symfony\Bundle\TwigBundle\Controller\ExceptionController 

以及

Symfony\Component\HttpKernel\EventListener\ExceptionListener 
+0

謝謝你的答覆。像一個迷人的工作。 –

0

我使用 arguments: ["@twig", "%kernel.debug%"] 而不是 arguments: [@twig, %kernel.debug%]