[RFC] [DebugBundle] [HttpKernel] Avoid using container as dependency for DumpListener

This commit is contained in:
Jérôme Macias 2014-11-26 15:11:30 +01:00 committed by Nicolas Grekas
parent 6a59db5a08
commit 680fe7acb2
3 changed files with 28 additions and 50 deletions

View File

@ -18,8 +18,8 @@
<service id="debug.dump_listener" class="Symfony\Component\HttpKernel\EventListener\DumpListener"> <service id="debug.dump_listener" class="Symfony\Component\HttpKernel\EventListener\DumpListener">
<tag name="kernel.event_subscriber" /> <tag name="kernel.event_subscriber" />
<argument type="service" id="service_container" /> <argument type="service" id="var_dumper.cloner" />
<argument>data_collector.dump</argument> <argument type="service" id="data_collector.dump" />
</service> </service>
<service id="var_dumper.cloner" class="Symfony\Component\VarDumper\Cloner\VarCloner" /> <service id="var_dumper.cloner" class="Symfony\Component\VarDumper\Cloner\VarCloner" />

View File

@ -11,9 +11,10 @@
namespace Symfony\Component\HttpKernel\EventListener; namespace Symfony\Component\HttpKernel\EventListener;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface; use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\KernelEvents; use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\VarDumper\Cloner\ClonerInterface;
use Symfony\Component\VarDumper\Dumper\DataDumperInterface;
use Symfony\Component\VarDumper\VarDumper; use Symfony\Component\VarDumper\VarDumper;
/** /**
@ -27,30 +28,23 @@ class DumpListener implements EventSubscriberInterface
private $dumper; private $dumper;
/** /**
* @param ContainerInterface $container Service container, for lazy loading. * @param ClonerInterface $cloner Cloner service.
* @param string $dumper var_dumper dumper service to use. * @param DataDumperInterface $dumper Dumper service.
*/ */
public function __construct(ContainerInterface $container, $dumper) public function __construct(ClonerInterface $cloner, DataDumperInterface $dumper)
{ {
$this->container = $container; $this->cloner = $cloner;
$this->dumper = $dumper; $this->dumper = $dumper;
} }
public function configure() public function configure()
{ {
if ($this->container) { $cloner = $this->cloner;
$container = $this->container; $dumper = $this->dumper;
$dumper = $this->dumper;
$this->container = null;
VarDumper::setHandler(function ($var) use ($container, $dumper) { VarDumper::setHandler(function ($var) use ($cloner, $dumper) {
$dumper = $container->get($dumper); $dumper->dump($cloner->cloneVar($var));
$cloner = $container->get('var_dumper.cloner'); });
$handler = function ($var) use ($dumper, $cloner) {$dumper->dump($cloner->cloneVar($var));};
VarDumper::setHandler($handler);
$handler($var);
});
}
} }
public static function getSubscribedEvents() public static function getSubscribedEvents()

View File

@ -11,10 +11,11 @@
namespace Symfony\Component\HttpKernel\Tests\EventListener; namespace Symfony\Component\HttpKernel\Tests\EventListener;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Definition;
use Symfony\Component\HttpKernel\EventListener\DumpListener; use Symfony\Component\HttpKernel\EventListener\DumpListener;
use Symfony\Component\HttpKernel\KernelEvents; use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\VarDumper\Cloner\ClonerInterface;
use Symfony\Component\VarDumper\Cloner\Data;
use Symfony\Component\VarDumper\Dumper\DataDumperInterface;
use Symfony\Component\VarDumper\VarDumper; use Symfony\Component\VarDumper\VarDumper;
/** /**
@ -34,34 +35,23 @@ class DumpListenerTest extends \PHPUnit_Framework_TestCase
public function testConfigure() public function testConfigure()
{ {
$prevDumper = $this->getDumpHandler(); $prevDumper = VarDumper::setHandler('var_dump');
VarDumper::setHandler($prevDumper);
$container = new ContainerBuilder(); $cloner = new MockCloner();
$container->setDefinition('var_dumper.cloner', new Definition('Symfony\Component\HttpKernel\Tests\EventListener\MockCloner')); $dumper = new MockDumper();
$container->setDefinition('mock_dumper', new Definition('Symfony\Component\HttpKernel\Tests\EventListener\MockDumper'));
ob_start(); ob_start();
$exception = null; $exception = null;
$listener = new DumpListener($container, 'mock_dumper'); $listener = new DumpListener($cloner, $dumper);
try { try {
$listener->configure(); $listener->configure();
$lazyDumper = $this->getDumpHandler();
VarDumper::dump('foo'); VarDumper::dump('foo');
$loadedDumper = $this->getDumpHandler();
VarDumper::dump('bar'); VarDumper::dump('bar');
$this->assertSame('+foo-+bar-', ob_get_clean()); $this->assertSame('+foo-+bar-', ob_get_clean());
$listenerReflector = new \ReflectionClass($listener);
$lazyReflector = new \ReflectionFunction($lazyDumper);
$loadedReflector = new \ReflectionFunction($loadedDumper);
$this->assertSame($listenerReflector->getFilename(), $lazyReflector->getFilename());
$this->assertSame($listenerReflector->getFilename(), $loadedReflector->getFilename());
$this->assertGreaterThan($lazyReflector->getStartLine(), $loadedReflector->getStartLine());
} catch (\Exception $exception) { } catch (\Exception $exception) {
} }
@ -71,28 +61,22 @@ class DumpListenerTest extends \PHPUnit_Framework_TestCase
throw $exception; throw $exception;
} }
} }
private function getDumpHandler()
{
$prevDumper = VarDumper::setHandler('var_dump');
VarDumper::setHandler($prevDumper );
return $prevDumper;
}
} }
class MockCloner class MockCloner implements ClonerInterface
{ {
public function cloneVar($var) public function cloneVar($var)
{ {
return $var.'-'; return new Data(array($var.'-'));
} }
} }
class MockDumper class MockDumper implements DataDumperInterface
{ {
public function dump($var) public function dump(Data $data)
{ {
echo '+'.$var; $rawData = $data->getRawData();
echo '+'.$rawData[0];
} }
} }