2013-04-02 11 views
8

To pytanie jest związane z following change (część Symfony 2.2 wydaniu):Symfony 2.2 przedłużyć ExceptionController

część 1

w pre-2.2 Symfony, byłem nadrzędnymi ExceptionController wyświetlanie niektórych stron błędów niestandardowych .

Zrobiłem to poprzez:

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

Teraz, po aktualizacji do 2.2, już nie mogę tego zrobić, ponieważ jest wyjątek podczas generowania wyjątek (gra słów nie przeznaczonych):

ExceptionController :: __ construct() musi być instancją Twig_Environment, żaden danej nazwie, w ...

od ExceptionController jest usługą teraz, jak mogę to zmienić i co muszę zmienić w starym kodzie?

Wszystko zrobiłem w klasie niestandardowej ulega zmianie odniesienie szablonu w metodzie showAction:

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

Part 2

Od ExceptionController nie rozciąga ContainerAware, jak mogę dostać się do prądu pojemnik? Czy wystarczy wdrożyć ContainerAwareInterface?

Odpowiedz

12

należy zmienić kilka to:

  1. trzeba odziedziczyć ExceptionController w kontrolerze zwyczaj wyjątku.
  2. Musisz zastąpić twig.controller.exception.class parametr. Jak widać w the service file, używa on parametru twig.controller.exception.class do identyfikowania klasy kontrolera wyjątków. Teraz zastąpić go z klasy:

    parameters: 
        twig.controller.exception.class: My\CustomBundle\CustomExceptionController 
    
  3. trzeba edytować podpis showAction podążać za new signature

    Od ExceptionController nie rozciąga ContainerAware, jak mogę dostać się do obecnego pojemnika? Czy wystarczy wdrożyć ContainerAwareInterface? nie nigdy

Nie, usługi powinny wstrzyknąć kontenera. Powinieneś wstrzyknąć potrzebne usługi w konstruktorze, tak jak to się dzieje w przypadku usługi Twig_Environment.

Wewnątrz kontrolera Exception uzyskujesz dostęp do właściwości $this->twig dla usługi gałązek. A nowa sygnatura otrzymuje parametr $request, aby uzyskać żądanie. Nie sądzę, że potrzebujesz więcej.(otrzymujesz także $this->debug)

+0

Dzięki Wouter! To czego mi brakowało to nadpisanie twig.controller.exception.class. Teraz działa jak urok. – isyndicate

+1

Właściwie w drugiej części mojego pytania, w poprzedniej implementacji ExceptionController, udało mi się pobrać parametr z $ this-> container-> getParameter(). Jak mogę pobrać ten sam parametr w nowym niestandardowym kontrolerze wyjątków, skoro jest to usługa? Czy użycie $ this-> twig-> getGlobals() byłoby właściwą drogą? – isyndicate

+1

Ten poradnik okazał się również przydatny: https://knpuniversity.com/screencast/symfony2-ep3/error-pages – shakaran