[RFC] [DebugBundle] [HttpKernel] Avoid using container as dependency for DumpListener
This commit is contained in:
parent
6a59db5a08
commit
680fe7acb2
@ -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" />
|
||||||
|
@ -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,31 +28,24 @@ 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()
|
||||||
{
|
{
|
||||||
|
@ -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];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user