2015-08-17 17:00:26 -07:00
< ? php
/*
* This file is part of the Symfony package .
*
* ( c ) Fabien Potencier < fabien @ symfony . com >
*
* For the full copyright and license information , please view the LICENSE
* file that was distributed with this source code .
*/
namespace Symfony\Component\HttpKernel\Debug ;
use Symfony\Component\EventDispatcher\Debug\TraceableEventDispatcher as BaseTraceableEventDispatcher ;
use Symfony\Component\HttpKernel\Profiler\Profiler ;
use Symfony\Component\HttpKernel\KernelEvents ;
use Symfony\Component\EventDispatcher\Event ;
/**
* Collects some data about event listeners .
*
* This event dispatcher delegates the dispatching to another one .
*
* @ author Fabien Potencier < fabien @ symfony . com >
*/
class TraceableEventDispatcher extends BaseTraceableEventDispatcher
{
/**
* Sets the profiler .
*
* The traceable event dispatcher does not use the profiler anymore .
* The job is now done directly by the Profiler listener and the
* data collectors themselves .
*
* @ param Profiler | null $profiler A Profiler instance
*
* @ deprecated since version 2.4 , to be removed in 3.0 .
*/
public function setProfiler ( Profiler $profiler = null )
{
2015-08-27 12:03:05 -07:00
@ trigger_error ( 'The ' . __METHOD__ . ' method is deprecated since version 2.4 and will be removed in 3.0.' , E_USER_DEPRECATED );
2015-08-17 17:00:26 -07:00
}
/**
* { @ inheritdoc }
*/
protected function preDispatch ( $eventName , Event $event )
{
switch ( $eventName ) {
case KernelEvents :: REQUEST :
$this -> stopwatch -> openSection ();
break ;
case KernelEvents :: VIEW :
case KernelEvents :: RESPONSE :
// stop only if a controller has been executed
if ( $this -> stopwatch -> isStarted ( 'controller' )) {
$this -> stopwatch -> stop ( 'controller' );
}
break ;
case KernelEvents :: TERMINATE :
$token = $event -> getResponse () -> headers -> get ( 'X-Debug-Token' );
// There is a very special case when using built-in AppCache class as kernel wrapper, in the case
// of an ESI request leading to a `stale` response [B] inside a `fresh` cached response [A].
// In this case, `$token` contains the [B] debug token, but the open `stopwatch` section ID
// is equal to the [A] debug token. Trying to reopen section with the [B] token throws an exception
// which must be caught.
try {
$this -> stopwatch -> openSection ( $token );
} catch ( \LogicException $e ) {
}
break ;
}
}
/**
* { @ inheritdoc }
*/
protected function postDispatch ( $eventName , Event $event )
{
switch ( $eventName ) {
case KernelEvents :: CONTROLLER :
$this -> stopwatch -> start ( 'controller' , 'section' );
break ;
case KernelEvents :: RESPONSE :
$token = $event -> getResponse () -> headers -> get ( 'X-Debug-Token' );
$this -> stopwatch -> stopSection ( $token );
break ;
case KernelEvents :: TERMINATE :
// In the special case described in the `preDispatch` method above, the `$token` section
// does not exist, then closing it throws an exception which must be caught.
$token = $event -> getResponse () -> headers -> get ( 'X-Debug-Token' );
try {
$this -> stopwatch -> stopSection ( $token );
} catch ( \LogicException $e ) {
}
break ;
}
}
}