[HttpKernel] added LateDataCollectorInterface

This commit is contained in:
Fabien Potencier 2013-09-30 07:59:16 +02:00
parent 9c4bc9a0ed
commit 5cedea2c07
6 changed files with 77 additions and 30 deletions

View File

@ -11,6 +11,7 @@
namespace Symfony\Component\HttpKernel\DataCollector; namespace Symfony\Component\HttpKernel\DataCollector;
use Symfony\Component\HttpKernel\DataCollector\LateDataCollectorInterface;
use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\EventDispatcher\EventDispatcherInterface; use Symfony\Component\EventDispatcher\EventDispatcherInterface;
@ -21,7 +22,7 @@ use Symfony\Component\EventDispatcher\Debug\TraceableEventDispatcherInterface;
* *
* @author Fabien Potencier <fabien@symfony.com> * @author Fabien Potencier <fabien@symfony.com>
*/ */
class EventDataCollector extends DataCollector class EventDataCollector extends DataCollector implements LateDataCollectorInterface
{ {
protected $dispatcher; protected $dispatcher;
@ -41,6 +42,14 @@ class EventDataCollector extends DataCollector
); );
} }
public function lateCollect()
{
if ($this->dispatcher instanceof TraceableEventDispatcherInterface) {
$this->setCalledListeners($this->dispatcher->getCalledListeners());
$this->setNotCalledListeners($this->dispatcher->getNotCalledListeners());
}
}
/** /**
* Sets the called listeners. * Sets the called listeners.
* *
@ -89,16 +98,6 @@ class EventDataCollector extends DataCollector
return $this->data['not_called_listeners']; return $this->data['not_called_listeners'];
} }
public function serialize()
{
if ($this->dispatcher instanceof TraceableEventDispatcherInterface) {
$this->setCalledListeners($this->dispatcher->getCalledListeners());
$this->setNotCalledListeners($this->dispatcher->getNotCalledListeners());
}
return parent::serialize();
}
/** /**
* {@inheritdoc} * {@inheritdoc}
*/ */

View File

@ -0,0 +1,28 @@
<?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\DataCollector;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
/**
* LateDataCollectorInterface.
*
* @author Fabien Potencier <fabien@symfony.com>
*/
interface LateDataCollectorInterface
{
/**
* Collects data as late as possible.
*/
public function lateCollect();
}

View File

@ -32,6 +32,14 @@ class LoggerDataCollector extends DataCollector
} }
} }
/**
* {@inheritdoc}
*/
public function collect(Request $request, Response $response, \Exception $exception = null)
{
// everything is done as late as possible
}
/** /**
* {@inheritdoc} * {@inheritdoc}
*/ */

View File

@ -11,6 +11,7 @@
namespace Symfony\Component\HttpKernel\DataCollector; namespace Symfony\Component\HttpKernel\DataCollector;
use Symfony\Component\HttpKernel\DataCollector\LateDataCollectorInterface;
use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\Response;
@ -19,7 +20,7 @@ use Symfony\Component\HttpFoundation\Response;
* *
* @author Fabien Potencier <fabien@symfony.com> * @author Fabien Potencier <fabien@symfony.com>
*/ */
class MemoryDataCollector extends DataCollector class MemoryDataCollector extends DataCollector implements LateDataCollectorInterface
{ {
public function __construct() public function __construct()
{ {
@ -37,6 +38,14 @@ class MemoryDataCollector extends DataCollector
$this->updateMemoryUsage(); $this->updateMemoryUsage();
} }
/**
* {@inheritdoc}
*/
public function lateCollect()
{
$this->updateMemoryUsage();
}
/** /**
* Gets the memory. * Gets the memory.
* *
@ -65,13 +74,6 @@ class MemoryDataCollector extends DataCollector
$this->data['memory'] = memory_get_peak_usage(true); $this->data['memory'] = memory_get_peak_usage(true);
} }
public function serialize()
{
$this->updateMemoryUsage();
return parent::serialize();
}
/** /**
* {@inheritdoc} * {@inheritdoc}
*/ */

View File

@ -12,6 +12,7 @@
namespace Symfony\Component\HttpKernel\DataCollector; namespace Symfony\Component\HttpKernel\DataCollector;
use Symfony\Component\HttpKernel\DataCollector\DataCollector; use Symfony\Component\HttpKernel\DataCollector\DataCollector;
use Symfony\Component\HttpKernel\DataCollector\LateDataCollectorInterface;
use Symfony\Component\HttpKernel\KernelInterface; use Symfony\Component\HttpKernel\KernelInterface;
use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\Response;
@ -22,7 +23,7 @@ use Symfony\Component\Stopwatch\Stopwatch;
* *
* @author Fabien Potencier <fabien@symfony.com> * @author Fabien Potencier <fabien@symfony.com>
*/ */
class TimeDataCollector extends DataCollector class TimeDataCollector extends DataCollector implements LateDataCollectorInterface
{ {
protected $kernel; protected $kernel;
protected $stopwatch; protected $stopwatch;
@ -51,6 +52,17 @@ class TimeDataCollector extends DataCollector
); );
} }
/**
* {@inheritdoc}
*/
public function lateCollect()
{
if (null !== $this->stopwatch && isset($this->data['token'])) {
$this->setEvents($this->stopwatch->getSectionEvents($this->data['token']));
}
unset($this->data['token']);
}
/** /**
* Sets the request events. * Sets the request events.
* *
@ -117,16 +129,6 @@ class TimeDataCollector extends DataCollector
return $this->data['start_time']; return $this->data['start_time'];
} }
public function serialize()
{
if (null !== $this->stopwatch && isset($this->data['token'])) {
$this->setEvents($this->stopwatch->getSectionEvents($this->data['token']));
}
unset($this->data['token']);
return parent::serialize();
}
/** /**
* {@inheritdoc} * {@inheritdoc}
*/ */

View File

@ -15,6 +15,7 @@ use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Profiler\ProfilerStorageInterface; use Symfony\Component\HttpKernel\Profiler\ProfilerStorageInterface;
use Symfony\Component\HttpKernel\DataCollector\DataCollectorInterface; use Symfony\Component\HttpKernel\DataCollector\DataCollectorInterface;
use Symfony\Component\HttpKernel\DataCollector\LateDataCollectorInterface;
use Psr\Log\LoggerInterface; use Psr\Log\LoggerInterface;
/** /**
@ -109,6 +110,13 @@ class Profiler
*/ */
public function saveProfile(Profile $profile) public function saveProfile(Profile $profile)
{ {
// late collect
foreach ($profile->getCollectors() as $collector) {
if ($collector instanceof LateDataCollectorInterface) {
$collector->lateCollect();
}
}
if (!($ret = $this->storage->write($profile)) && null !== $this->logger) { if (!($ret = $this->storage->write($profile)) && null !== $this->logger) {
$this->logger->warning('Unable to store the profiler information.'); $this->logger->warning('Unable to store the profiler information.');
} }