8

この質問は、次の変更に関連しています(Symfony 2.2 リリースの一部):

パート1

2.2 より前の Symfony では、ExceptionControllerいくつかのカスタム エラー ページを表示するためにオーバーライドしていました。

私はそれを次の方法で行いました:

parameters:
       twig.exception_listener.controller: My\CustomBundle\CustomExceptionController::showAction

現在、2.2 にアップグレードした後、例外の生成中に例外がスローされるため、これを行うことができなくなりました (しゃれは意図されていません)。

ExceptionController::__construct() は Twig_Environment のインスタンスである必要があり、何も指定されず、呼び出されます...

は現在サービスであるため、それExceptionControllerをオーバーライドするにはどうすればよいですか?また、古いコードで何を変更する必要がありますか?

カスタム クラスで行ったのは、showAction メソッドのテンプレート参照を変更したことだけです。

$template = new TemplateReference('TwigBundle', 'Exception', $name, $format, 'twig');

パート2

ExceptionControllerextends がなくなったのでContainerAware、現在のコンテナーにアクセスするにはどうすればよいですか? 実装するだけで十分ContainerAwareInterfaceですか?

4

1 に答える 1

12

これをいくつか変更する必要があります。

  1. カスタム例外コントローラーでを継承するExceptionController必要があります。
  2. パラメータをオーバーライドtwig.controller.exception.classする必要があります。サービス ファイルでわかるように、twig.controller.exception.classパラメーターを使用して例外コントローラー クラスを識別します。クラスでオーバーライドします。

    parameters:
        twig.controller.exception.class: My\CustomBundle\CustomExceptionController
    
  3. 新しい署名showActionに従うようにの署名を編集する必要があります

    ExceptionControllerextends がなくなったのでContainerAware、現在のコンテナーにアクセスするにはどうすればよいですか? 実装するだけで十分ContainerAwareInterfaceですか?

いいえ、サービスはコンテナーを挿入するべきではありません。サービスで行われるように、コンストラクターで必要なサービスを注入する必要がありTwig_Environmentます。

$this->twig例外コントローラー内で、twig サービスのプロパティにアクセスできます。そして、新しい署名は$requestパラメーターを取得して、リクエストを取得します。これ以上は必要ないと思います。(あなたも得る$this->debug

于 2013-04-02T20:40:03.217 に答える