From bd0ad9255908c0880cd51e01b9be2c430c6ca84e Mon Sep 17 00:00:00 2001 From: Igor Wiedler Date: Thu, 7 Feb 2013 19:50:13 +0100 Subject: [PATCH] [DependencyInjection] Allow frozen containers to be dumped to graphviz --- .../Dumper/GraphvizDumper.php | 24 +++++++++++++++++-- .../Tests/Fixtures/containers/container13.php | 13 ++++++++++ .../Tests/Fixtures/containers/container14.php | 11 +++++++++ .../Tests/Fixtures/graphviz/services13.dot | 8 +++++++ .../Tests/Fixtures/graphviz/services14.dot | 7 ++++++ .../Dumper/GraphvizDumperTest.php | 14 +++++++++++ 6 files changed, 75 insertions(+), 2 deletions(-) create mode 100644 src/Symfony/Component/DependencyInjection/Tests/Fixtures/containers/container13.php create mode 100644 src/Symfony/Component/DependencyInjection/Tests/Fixtures/containers/container14.php create mode 100644 src/Symfony/Component/DependencyInjection/Tests/Fixtures/graphviz/services13.dot create mode 100644 src/Symfony/Component/DependencyInjection/Tests/Fixtures/graphviz/services14.dot diff --git a/src/Symfony/Component/DependencyInjection/Dumper/GraphvizDumper.php b/src/Symfony/Component/DependencyInjection/Dumper/GraphvizDumper.php index debdc527091e6..61320f996f5ba 100644 --- a/src/Symfony/Component/DependencyInjection/Dumper/GraphvizDumper.php +++ b/src/Symfony/Component/DependencyInjection/Dumper/GraphvizDumper.php @@ -15,6 +15,8 @@ use Symfony\Component\DependencyInjection\Reference; use Symfony\Component\DependencyInjection\Parameter; use Symfony\Component\DependencyInjection\ContainerInterface; +use Symfony\Component\DependencyInjection\ContainerBuilder; +use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag; /** * GraphvizDumper dumps a service container as a graphviz file. @@ -159,7 +161,7 @@ private function findNodes() { $nodes = array(); - $container = clone $this->container; + $container = $this->cloneContainer(); foreach ($container->getDefinitions() as $id => $definition) { $nodes[$id] = array('class' => str_replace('\\', '\\\\', $this->container->getParameterBag()->resolveValue($definition->getClass())), 'attributes' => array_merge($this->options['node.definition'], array('style' => ContainerInterface::SCOPE_PROTOTYPE !== $definition->getScope() ? 'filled' : 'dotted'))); @@ -175,13 +177,31 @@ private function findNodes() } if (!$container->hasDefinition($id)) { - $nodes[$id] = array('class' => str_replace('\\', '\\\\', get_class($service)), 'attributes' => $this->options['node.instance']); + $class = ('service_container' === $id) ? get_class($this->container) : get_class($service); + $nodes[$id] = array('class' => str_replace('\\', '\\\\', $class), 'attributes' => $this->options['node.instance']); } } return $nodes; } + private function cloneContainer() + { + $parameterBag = new ParameterBag($this->container->getParameterBag()->all()); + + $container = new ContainerBuilder($parameterBag); + $container->setDefinitions($this->container->getDefinitions()); + $container->setAliases($this->container->getAliases()); + foreach ($this->container->getScopes() as $scope) { + $container->addScope($scope); + } + foreach ($this->container->getExtensions() as $extension) { + $container->registerExtension($extension); + } + + return $container; + } + /** * Returns the start dot. * diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/containers/container13.php b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/containers/container13.php new file mode 100644 index 0000000000000..17b32cf5125fe --- /dev/null +++ b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/containers/container13.php @@ -0,0 +1,13 @@ + + register('foo', 'FooClass')-> + addArgument(new Reference('bar')) +; +$container->compile(); + +return $container; diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/containers/container14.php b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/containers/container14.php new file mode 100644 index 0000000000000..593be9c399363 --- /dev/null +++ b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/containers/container14.php @@ -0,0 +1,11 @@ + array('fillcolor' => 'red', 'style' => 'empty'), )), str_replace('%path%', __DIR__, file_get_contents(self::$fixturesPath.'/graphviz/services10-1.dot')), '->dump() dumps services'); } + + public function testDumpWithFrozenContainer() + { + $container = include self::$fixturesPath.'/containers/container13.php'; + $dumper = new GraphvizDumper($container); + $this->assertEquals(str_replace('%path%', __DIR__, file_get_contents(self::$fixturesPath.'/graphviz/services13.dot')), $dumper->dump(), '->dump() dumps services'); + } + + public function testDumpWithFrozenCustomClassContainer() + { + $container = include self::$fixturesPath.'/containers/container14.php'; + $dumper = new GraphvizDumper($container); + $this->assertEquals(str_replace('%path%', __DIR__, file_get_contents(self::$fixturesPath.'/graphviz/services14.dot')), $dumper->dump(), '->dump() dumps services'); + } }