[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">
|
||||
<tag name="kernel.event_subscriber" />
|
||||
<argument type="service" id="service_container" />
|
||||
<argument>data_collector.dump</argument>
|
||||
<argument type="service" id="var_dumper.cloner" />
|
||||
<argument type="service" id="data_collector.dump" />
|
||||
</service>
|
||||
|
||||
<service id="var_dumper.cloner" class="Symfony\Component\VarDumper\Cloner\VarCloner" />
|
||||
|
@ -11,9 +11,10 @@
|
||||
|
||||
namespace Symfony\Component\HttpKernel\EventListener;
|
||||
|
||||
use Symfony\Component\DependencyInjection\ContainerInterface;
|
||||
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
|
||||
use Symfony\Component\HttpKernel\KernelEvents;
|
||||
use Symfony\Component\VarDumper\Cloner\ClonerInterface;
|
||||
use Symfony\Component\VarDumper\Dumper\DataDumperInterface;
|
||||
use Symfony\Component\VarDumper\VarDumper;
|
||||
|
||||
/**
|
||||
@ -27,31 +28,24 @@ class DumpListener implements EventSubscriberInterface
|
||||
private $dumper;
|
||||
|
||||
/**
|
||||
* @param ContainerInterface $container Service container, for lazy loading.
|
||||
* @param string $dumper var_dumper dumper service to use.
|
||||
* @param ClonerInterface $cloner Cloner service.
|
||||
* @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;
|
||||
}
|
||||
|
||||
public function configure()
|
||||
{
|
||||
if ($this->container) {
|
||||
$container = $this->container;
|
||||
$cloner = $this->cloner;
|
||||
$dumper = $this->dumper;
|
||||
$this->container = null;
|
||||
|
||||
VarDumper::setHandler(function ($var) use ($container, $dumper) {
|
||||
$dumper = $container->get($dumper);
|
||||
$cloner = $container->get('var_dumper.cloner');
|
||||
$handler = function ($var) use ($dumper, $cloner) {$dumper->dump($cloner->cloneVar($var));};
|
||||
VarDumper::setHandler($handler);
|
||||
$handler($var);
|
||||
VarDumper::setHandler(function ($var) use ($cloner, $dumper) {
|
||||
$dumper->dump($cloner->cloneVar($var));
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
public static function getSubscribedEvents()
|
||||
{
|
||||
|
@ -11,10 +11,11 @@
|
||||
|
||||
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\KernelEvents;
|
||||
use Symfony\Component\VarDumper\Cloner\ClonerInterface;
|
||||
use Symfony\Component\VarDumper\Cloner\Data;
|
||||
use Symfony\Component\VarDumper\Dumper\DataDumperInterface;
|
||||
use Symfony\Component\VarDumper\VarDumper;
|
||||
|
||||
/**
|
||||
@ -34,34 +35,23 @@ class DumpListenerTest extends \PHPUnit_Framework_TestCase
|
||||
|
||||
public function testConfigure()
|
||||
{
|
||||
$prevDumper = $this->getDumpHandler();
|
||||
$prevDumper = VarDumper::setHandler('var_dump');
|
||||
VarDumper::setHandler($prevDumper);
|
||||
|
||||
$container = new ContainerBuilder();
|
||||
$container->setDefinition('var_dumper.cloner', new Definition('Symfony\Component\HttpKernel\Tests\EventListener\MockCloner'));
|
||||
$container->setDefinition('mock_dumper', new Definition('Symfony\Component\HttpKernel\Tests\EventListener\MockDumper'));
|
||||
$cloner = new MockCloner();
|
||||
$dumper = new MockDumper();
|
||||
|
||||
ob_start();
|
||||
$exception = null;
|
||||
$listener = new DumpListener($container, 'mock_dumper');
|
||||
$listener = new DumpListener($cloner, $dumper);
|
||||
|
||||
try {
|
||||
$listener->configure();
|
||||
|
||||
$lazyDumper = $this->getDumpHandler();
|
||||
VarDumper::dump('foo');
|
||||
|
||||
$loadedDumper = $this->getDumpHandler();
|
||||
VarDumper::dump('bar');
|
||||
|
||||
$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) {
|
||||
}
|
||||
|
||||
@ -71,28 +61,22 @@ class DumpListenerTest extends \PHPUnit_Framework_TestCase
|
||||
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)
|
||||
{
|
||||
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