Symfony2.0のエラーページをカスタマイズしたい
これはのレイアウトを上書きすることで行われることは知っていますが、app/Resources/TwigBundle/views/Exception/*
ルートごとに異なるエラーページが必要です。
バックエンド用とフロントエンド用に1つずつ必要です。
どうすればこれを達成できますか?
Symfony2.0のエラーページをカスタマイズしたい
これはのレイアウトを上書きすることで行われることは知っていますが、app/Resources/TwigBundle/views/Exception/*
ルートごとに異なるエラーページが必要です。
バックエンド用とフロントエンド用に1つずつ必要です。
どうすればこれを達成できますか?
あなたがしなければならないことは、それほど難しいことではありません。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
私は
arguments: ["@twig", "%kernel.debug%"]
代わりに
使用しますarguments: [@twig, %kernel.debug%]