2013-04-02 14 views
8

Questa domanda è legata al following change (parte di Symfony 2.2 release):Symfony 2.2 estendere ExceptionController

Parte 1

In pre-2.2 Symfony, ero imperativi ExceptionController per visualizzare alcune pagine di errore personalizzate .

ho fatto attraverso:

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

Ora, dopo l'aggiornamento a 2.2, non posso più farlo, perché viene generata un'eccezione durante la generazione di un'eccezione (no pun intended):

ExceptionController :: __ construct() deve essere un'istanza di Twig_Environment, nessuno dato, chiamato in ...

Dal ExceptionController è un servizio di ora, come posso sovrascriverlo e cosa devo cambiare nel mio vecchio codice?

Tutto quello che ho fatto in classe personalizzata, è cambiato il riferimento del modello di metodo showAction:

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

Parte 2

Dal ExceptionController non si estende ContainerAware, come ottengo alla corrente contenitore? È sufficiente implementare ContainerAwareInterface?

risposta

12

si dovrebbe cambiare un paio di questo:

  1. è necessario ereditare il ExceptionController nel controllore eccezione personalizzata.
  2. necessario ignorare il parametro twig.controller.exception.class. Come si può vedere in the service file, utilizza il parametro twig.controller.exception.class per identificare la classe del controller di eccezione. Ora sovrascrivere con la classe:

    parameters: 
        twig.controller.exception.class: My\CustomBundle\CustomExceptionController 
    
  3. è necessario modificare la firma del showAction di seguire il new signature

    Dal ExceptionController non si estende ContainerAware, come faccio a portare al contenitore corrente? È sufficiente implementare ContainerAwareInterface? Non mai

No, servizi dovrebbe iniettare il contenitore. È necessario iniettare i servizi necessari nel costruttore, come nel caso del servizio Twig_Environment.

All'interno del controller Exception, è possibile accedere alla proprietà $this->twig per il servizio twig. E la nuova firma ottiene un parametro $request, per ottenere la richiesta. Non penso che tu abbia bisogno di più.(si ottiene anche $this->debug)

+0

Grazie Wouter! Quello che mi mancava è l'override di twig.controller.exception.class. Funziona come un fascino ora. – isyndicate

+1

In realtà per la seconda parte della mia domanda, nella precedente implementazione di ExceptionController, sono riuscito a recuperare i parametri da $ this-> container-> getParameter(). Come posso recuperare lo stesso parametro nel nuovo controller eccezioni personalizzato, ora che si tratta di un servizio? Usare $ this-> twig-> getGlobals() sarebbe la strada giusta da percorrere? – isyndicate

+1

Ho trovato utile anche questo tutorial: https://knpuniversity.com/screencast/symfony2-ep3/error-pages – shakaran