16
16
use Symfony \Component \Debug \ExceptionHandler ;
17
17
use Symfony \Component \EventDispatcher \Event ;
18
18
use Symfony \Component \EventDispatcher \EventSubscriberInterface ;
19
+ use Symfony \Component \HttpKernel \Event \GetResponseEvent ;
19
20
use Symfony \Component \HttpKernel \Event \KernelEvent ;
20
21
use Symfony \Component \HttpKernel \KernelEvents ;
21
22
use Symfony \Component \Console \ConsoleEvents ;
@@ -36,6 +37,7 @@ class DebugHandlersListener implements EventSubscriberInterface
36
37
private $ scream ;
37
38
private $ fileLinkFormat ;
38
39
private $ firstCall = true ;
40
+ private $ hasTerminatedWithException ;
39
41
40
42
/**
41
43
* @param callable|null $exceptionHandler A handler that will be called on Exception
@@ -60,14 +62,16 @@ public function __construct($exceptionHandler, LoggerInterface $logger = null, $
60
62
*/
61
63
public function configure (Event $ event = null )
62
64
{
63
- if (!$ this ->firstCall ) {
65
+ if (!$ event instanceof GetResponseEvent ? ! $ this ->firstCall : ! $ event -> getRequest ()-> isMasterRequest () ) {
64
66
return ;
65
67
}
66
- $ this ->firstCall = false ;
68
+ $ this ->firstCall = $ this ->hasTerminatedWithException = false ;
69
+
70
+ $ handler = set_exception_handler ('var_dump ' );
71
+ $ handler = is_array ($ handler ) ? $ handler [0 ] : null ;
72
+ restore_exception_handler ();
73
+
67
74
if ($ this ->logger || null !== $ this ->throwAt ) {
68
- $ handler = set_error_handler ('var_dump ' );
69
- $ handler = is_array ($ handler ) ? $ handler [0 ] : null ;
70
- restore_error_handler ();
71
75
if ($ handler instanceof ErrorHandler) {
72
76
if ($ this ->logger ) {
73
77
$ handler ->setDefaultLogger ($ this ->logger , $ this ->levels );
@@ -91,8 +95,16 @@ public function configure(Event $event = null)
91
95
}
92
96
if (!$ this ->exceptionHandler ) {
93
97
if ($ event instanceof KernelEvent) {
94
- if (method_exists ($ event ->getKernel (), 'terminateWithException ' )) {
95
- $ this ->exceptionHandler = array ($ event ->getKernel (), 'terminateWithException ' );
98
+ if (method_exists ($ kernel = $ event ->getKernel (), 'terminateWithException ' )) {
99
+ $ request = $ event ->getRequest ();
100
+ $ hasRun = &$ this ->hasTerminatedWithException ;
101
+ $ this ->exceptionHandler = function (\Exception $ e ) use ($ kernel , $ request , &$ hasRun ) {
102
+ if ($ hasRun ) {
103
+ throw $ e ;
104
+ }
105
+ $ hasRun = true ;
106
+ $ kernel ->terminateWithException ($ e , $ request );
107
+ };
96
108
}
97
109
} elseif ($ event instanceof ConsoleEvent && $ app = $ event ->getCommand ()->getApplication ()) {
98
110
$ output = $ event ->getOutput ();
@@ -105,9 +117,6 @@ public function configure(Event $event = null)
105
117
}
106
118
}
107
119
if ($ this ->exceptionHandler ) {
108
- $ handler = set_exception_handler ('var_dump ' );
109
- $ handler = is_array ($ handler ) ? $ handler [0 ] : null ;
110
- restore_exception_handler ();
111
120
if ($ handler instanceof ErrorHandler) {
112
121
$ h = $ handler ->setExceptionHandler ('var_dump ' ) ?: $ this ->exceptionHandler ;
113
122
$ handler ->setExceptionHandler ($ h );
0 commit comments