2012-02-27 5 views
2

Comment puis-je configurer des pages d'erreur personnalisées uniquement pour l'environnement PROD? Je veux montrer ceux personnalisés pour la production mais ceux ordinaires avec des exceptions pour l'environnement de dev.Pages d'erreur personnalisées pour l'environnement PROD uniquement?

Des idées?

+1

Qu'est-ce que vous avez besoin est int le livre de recettes (DEV la page d'exception est toujours le même, il ne touche que l'environnement PROD): http://symfony.com/doc/current/cookbook/controller/error_pages.html – AlterPHP

Répondre

6

J'ai eu le même problème et la solution était assez facile. Vous devez modifier le paramètre twig.exception_listener.contoller pour rediriger le rendu de la page d'erreur vers votre propre contrôleur, ce qui peut étendre le contrôleur d'exception Twig original.

Exemple (YourBundle/Resources/config/services.xml):

<parameter key="twig.exception_listener.controller">YourBundle\Controller\ExceptionController::showAction</parameter> 

Ensuite, vous devez créer votre propre ExceptionController avec la méthode showAction, vérifiez l'environnement et faire ce que vous voulez faire ou passer à la demande parent::showAction().

namespace YourBundle\Controller; 

use Symfony\Bundle\TwigBundle\Controller\ExceptionController as BaseExceptionController; 
use Symfony\Bundle\FrameworkBundle\Templating\TemplateReference; 
use Symfony\Component\HttpKernel\Exception\FlattenException; 
use Symfony\Component\HttpKernel\Log\DebugLoggerInterface; 
use Symfony\Component\HttpFoundation\Response; 

class ExceptionController extends BaseExceptionController { 

    public function showAction(FlattenException $exception, DebugLoggerInterface $logger = null, $format = 'html') { 
     $kernel = $this->container->get('kernel'); 

     if ($kernel->getEnvironment() == 'prod') { 
      $request = $this->container->get('request'); 
      $request->setRequestFormat($format); 

      $templating = $this->container->get('templating'); 
      $code = $exception->getStatusCode(); 

      $template = new TemplateReference('YourBundle', 'Exception', 'errorpage', $format, 'twig'); 
      if ($templating->exists($template)) { 
        $response = $templating->renderResponse($template, array(
         'status_code' => $code, 
         'message_code' => 'error_' . $code, 
         'status_text' => Response::$statusTexts[$code], 
         'requested_url' => $request->getUri(), 
       )); 

       $response->setStatusCode($code); 
       $response->headers->replace($exception->getHeaders()); 

       return $response; 
      } 
     } 

     return parent::showAction($exception, $logger, $format); 
    } 
} 

Méfiez-vous des erreurs dans errorpage.html.twig, car les exceptions dans le traitement des twig ne sont pas traitées comme d'habitude.

0

Si vous ne voulez pas remplacer le contrôleur d'exception:

Vous pouvez d'abord copier le dossier entier (ou un fichier de mise en page spécifique) à

\vendor\symfony\symfony\src\Symfony\Bundle\TwigBundle\Resources\views\ 

à

\app\Resources\TwigBundle\views 

Ensuite, Personnalisez l'affichage dans chaque fichier de mise en page pour qu'il corresponde à votre conception.

Puis dans le fichier de mise en page, personnaliser le message pour chaque environnement suivre

{% if app.environment == 'prod' %} 
// message for prod 
{% else %} 
// message for dev 
{% endif %} 
Questions connexes