2016-08-19 4 views
0

Ich folgte den Anweisungen here und ich habe eine benutzerdefinierte error.html.twig (Der 3. Fall). Ich habe auch einen Custom Controller gemacht.Symfony: Redirect Fehler 403, 500, ... auf die 404 Seite

Ich habe 2 Probleme:

erstes Problem Wo muß ich meine benutzerdefinierten Controller setzen? Ich verstehe nicht, die doc dafür: https://symfony.com/doc/current/controller/error_pages.html#overriding-the-default-exceptioncontroller

zweites Problem Ich versuche, 403, 500 zu umleiten, ... Fehler auf dieser Seite. Wenn Sie versuchen, auf einen Ordner zuzugreifen, haben Sie "Zugriff verboten".

Ich habe versucht, dies in der .htaccess hinzuzufügen: ErrorDocument 403 http://www.xxx.fr/, aber ich weiß nicht, was die URL der 404-Seite ist.

EDIT

Ok ich verstanden, wo mein Controller zu setzen, aber ich erhalte eine Fehlermeldung.

Das ist mein ExceptionController.php

namespace Symfony\Bundle\TwigBundle\Controller; 

use Symfony\Component\Debug\Exception\FlattenException; 
use Symfony\Component\HttpKernel\Log\DebugLoggerInterface; 
use Symfony\Component\HttpFoundation\Request; 
use Symfony\Component\HttpFoundation\Response; 


class ExceptionController 
{ 
    public function showAction() 
    { 
     $dir = $this->get('kernel')->getRootDir() . '/../web/images/theme/404/'; 
     $dh = opendir($dir); 
     $errorFiles = array(); 
     while (false !== ($filename = readdir($dh))) 
      if ($filename != '.' && $filename != '..' && $filename[0] != '.') 
       $errorFiles[] = $filename; 

     shuffle($errorFiles); 

     return $this->render('errors/show.html.twig', [ 
        'gifs' => $errorFiles 
     ]); 
    } 
} 

Der Fehler

Whoops, sieht aus wie etwas schief gelaufen ist.

1/1 UndefinedMethodException in ExceptionController.php Linie 30: Versuchte namens eine undefinierte Methode aufrufen "get" der Klasse "Symfony \ Bundle \ TwigBundle \ Controllers \ ExceptionController". in ExceptionController.php Zeile 30

Dieser Controller funktionierte gut mit einer klassischen Ansicht.

+0

1) 'ExceptionController.php' innen' AppBundle' „Controller“ Ordner – pavlovich

+0

Von einem kurzen Blick auf die Symfony Seite, würde ich sagen, Sie keine zusätzlichen Apache-Richtlinien müssen. –

+0

@Olaf Dietsche Eigentlich bekomme ich "Hoppla, ein Fehler ist aufgetreten" wenn ich versuche auf eine leere URL zuzugreifen. Aber wenn ich versuche, auf einen Ordner zuzugreifen (ich habe Optionen -Indexe) bekomme ich "Access Forbidden". Dann ist es nicht die gleiche Seite;) – Pierrou

Antwort

0
  • erste Problem: Sie haben es auf ein Bündel zu setzen und in Ihre app/config/config.yml Datei:

    twig: 
         exception_controller: NameofMyBundleWhereIsTheControllerBundle:Exception:showException 
    
  • zweite Problem: Der beste Weg, wie es ist Im Kochbuch ist festgelegt, dass Sie einen eigenen Ereignis-Listener erstellen, der auf das Ereignis kernel.exception wartet und eine Seite rendert. Standardmäßig wird diese Ausnahme von der Ausnahme abgefangen, die von Twig bereitgestellt wird. Sie können, wie etwas tun:

    <?php 
    use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface; 
    use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent; 
    use Symfony\Component\HttpFoundation\Response; 
    
    public function onKernelException(GetResponseForExceptionEvent $event) 
    { 
        if ($event->getException() instanceof HttpExceptionInterface) { 
         $response = $this->templating->renderResponse(/* sitemap */); 
    
         $event->setResponse($response) 
        } 
    } 
    

    (ich diesen Code nicht getestet haben, so dass Sie es selbst versuchen sollten, Und Sie haben die Templat-Service in den Ereignis-Listener selbst zu injizieren, natürlich!).

  • 3. Problem oder Ihre Bearbeitung: Im doc sind sie 3 Möglichkeiten. Sie erstellen einen neuen Controller, aber Sie müssen alle Methoden kopieren, die darin definiert sind. Sie erweitern ExceptionController und ändern nur einige Methoden. Die dritte Möglichkeit ist, einen Service dafür zu leisten (was ich in meinem zweiten Problem sage).
    Also in Ihrem Fall versuchen Sie die zweite Möglichkeit und Sie vergessen so, von ExceptionController zu verlängern.

+0

Dies ist der Standard-Controller: http://pastebin.com/uAit4mSs gibt es keine "erweitert";) Deshalb verstehe ich nicht. Wenn ich es hinzufüge, habe ich einen anderen Fehler: ClassNotFoundException in ExceptionController.php Zeile 21: Versucht, Klasse "Controller" aus Namespace "Symfony \ Bundle \ TwigBundle \ Controller" zu laden. Haben Sie eine Anweisung "use" für "Symfony \ Bundle \ FrameworkBundle \ Controller \ Controller" vergessen? – Pierrou

+0

Ich habe meine thirs Antwort bearbeitet. Ich hoffe, es wird klarer werden. Ich habe meinen Code nach bearbeitet. Aber vergiss nicht, es ist ein Service und kein Controller. Für ref: http: //symfony.com/doc/current/service_container.html –

+0

Es tut mir leid, aber ich verstehe nicht wirklich diese Antwort in meinem Fall. – Pierrou