4

Symfony2.0のエラーページをカスタマイズしたい

これはのレイアウトを上書きすることで行われることは知っていますが、app/Resources/TwigBundle/views/Exception/*ルートごとに異なるエラーページが必要です。

バックエンド用とフロントエンド用に1つずつ必要です。

どうすればこれを達成できますか?

4

2 に答える 2

10

あなたがしなければならないことは、それほど難しいことではありません。symfony では、例外を処理するコントローラーを明示的に指定できます。したがって、config.yml では、twig 構成の下で例外コントローラーを指定できます。

Symfony 2.2以降

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

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

Symfony 2.1 まで:

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' => '',
            )
        );
    }
}

明らかに、必要に応じて現在のルートをテストする if ステートメントをカスタマイズする必要がありますが、これで十分です。

特定のエラー テンプレートを作成していない場合は、通常の Twig エラー ページにデフォルト設定されるコードを追加することをお勧めします。詳細については、次のコードを確認してください。

Symfony\Bundle\TwigBundle\Controller\ExceptionController

としても

Symfony\Component\HttpKernel\EventListener\ExceptionListener
于 2013-01-11T20:31:15.757 に答える
0

私は arguments: ["@twig", "%kernel.debug%"] 代わりに 使用しますarguments: [@twig, %kernel.debug%]

于 2017-05-25T07:00:03.290 に答える