2016-03-23 5 views
3

Ich untersuche die Symfony\Component\Debug\Debug. Soweit ich weiß, kann der AppKernel-Konstruktor ein zweites Argument akzeptieren, um zu definieren, ob die Debug-Modalität verwendet werden soll oder nicht (true/). Was ich eigentlich nicht verstehe, ist die Verwendung und Komplementarität von Debug::enable(), wie es in der app_dev.php auf dem offiziellen Symfony Github repository angezeigt wird.Fehlerspuren in einem Symfony 3-Controller können nicht blockiert werden.

Zum Beispiel habe ich versucht, ein Exception auf einem Controller, um den Effekt zu sehen zu werfen und ich bemerkte Debug::enable(); innerhalb app_dev.php aber ich sehe immer die error page.

Warum sehe ich immer noch Fehlerspuren trotz des Kommentars Debug::enable();?

Antwort

2

Kurze Erklärung

Die Debug::enable() Methode registriert eine Ausweichfehlerbehandlungsroutine, die aufgerufen wird, wenn die Anwendung einen Fehler zu handhaben ist fehlgeschlagen.

Die Fehlerseite, die beim Booten des Kernels mit dem $debug-Flag auf true angezeigt wird, ist das Ergebnis Ihrer Anwendungsfehlerbehandlung (implementiert von einem Ausnahme-Listener). Setzen Sie das Flag auf false, um Stack-Traces zu deaktivieren. Wenn Sie nur nach dem Testen sind, können Sie auch disable error pages in development.

Die von der Debug-Komponente angezeigte Seite ist nicht so schön wie die vom Ausnahme-Listener, aber es ist schöner als die PHP-Seite.

Ausführliche Erklärung

Der Front-Controller ruft die Anwendung Kernel:

$kernel = new AppKernel('dev', true); 
$response = $kernel->handle(Request::createFromGlobals()); 

Die Anwendung Kernel bootet selbst erzeugt den Container und ruft den http-Kernel die Anfrage zu bearbeiten:

public function handle(Request $request, $type = HttpKernelInterface::MASTER_REQUEST, $catch = true) 
{ 
    if (false === $this->booted) { 
     $this->boot(); 
    } 

    return $this->getHttpKernel()->handle($request, $type, $catch); 
} 

Der http-Kernel verwendet den Event-Dispatcher, um bestimmte Ereignisse auszulösen (kernel.request, , kernel.exception usw.). Wenn eine Ausnahme ausgelöst wird, während die Anforderung bearbeitet wird, wird der http-Kernel es fangen und löst das kernel.exception Ereignis:

// the following code is simplified to show the point 

public function handle(Request $request, $type = HttpKernelInterface::MASTER_REQUEST, $catch = true) 
{ 
    try { 
     return $this->handleRaw($request, $type); 
    } catch (\Exception $e) { 
     return $this->handleException($e, $request, $type); 
    } 
} 

private function handleException(\Exception $e, $request, $type) 
{ 
    $event = new GetResponseForExceptionEvent($this, $request, $type, $e); 
    $this->dispatcher->dispatch(KernelEvents::EXCEPTION, $event); 

    // ... 
} 

Einer der standardmäßig in der Symfony Standard Edition registriert Listener die Symfony\Component\HttpKernel\EventListener\ExceptionListener ist. Es ist verantwortlich für das Rendern schöner Fehlerseiten.

Es werden jedoch nur Ausnahmen behandelt, die beim Verarbeiten einer Anforderung im HTTP-Kernel ausgelöst werden. Wenn also irgendetwas außerhalb dieses Anrufs schief geht, wird es nicht behandelt (schauen Sie sich den Catch-Blog im vorherigen Codebeispiel an).

Hier kommt die Debug-Komponente ins Spiel. Die Methode Debug::enable() registriert einen Fehlerbehandler, einen Ausnahmebehandler und einen speziellen Klassenlader. Sie können es in jedem PHP-Projekt ohne den http-Kernel verwenden. Es handelt sich um eine Fallback-Fehlerbehandlung, die aufgerufen wird, wenn Ihre Anwendung einen Fehler nicht verarbeiten konnte. Es hat keine Beziehung zu dem Konstruktorargument $debug im Kernel.

Verwandte Themen