From c333eb70b67e1531de0131e3a14ea3c71eb92442 Mon Sep 17 00:00:00 2001 From: Christian Flothmann Date: Sun, 23 Oct 2016 08:49:28 +0200 Subject: [PATCH 1/4] merge tags instead of completely replacing them --- .../DependencyInjection/Compiler/DecoratorServicePass.php | 2 +- .../Tests/Compiler/DecoratorServicePassTest.php | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/Symfony/Component/DependencyInjection/Compiler/DecoratorServicePass.php b/src/Symfony/Component/DependencyInjection/Compiler/DecoratorServicePass.php index c7a4ac89c1..f0ac7ff945 100644 --- a/src/Symfony/Component/DependencyInjection/Compiler/DecoratorServicePass.php +++ b/src/Symfony/Component/DependencyInjection/Compiler/DecoratorServicePass.php @@ -43,7 +43,7 @@ class DecoratorServicePass implements CompilerPassInterface $container->setAlias($renamedId, new Alias((string) $alias, false)); } else { $decoratedDefinition = $container->getDefinition($inner); - $definition->setTags($decoratedDefinition->getTags(), $definition->getTags()); + $definition->setTags(array_merge($decoratedDefinition->getTags(), $definition->getTags())); $public = $decoratedDefinition->isPublic(); $decoratedDefinition->setPublic(false); $decoratedDefinition->setTags(array()); diff --git a/src/Symfony/Component/DependencyInjection/Tests/Compiler/DecoratorServicePassTest.php b/src/Symfony/Component/DependencyInjection/Tests/Compiler/DecoratorServicePassTest.php index b197e42249..10781e255e 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Compiler/DecoratorServicePassTest.php +++ b/src/Symfony/Component/DependencyInjection/Tests/Compiler/DecoratorServicePassTest.php @@ -87,17 +87,18 @@ class DecoratorServicePassTest extends \PHPUnit_Framework_TestCase $container = new ContainerBuilder(); $container ->register('foo') - ->setTags(array('name' => 'bar')) + ->setTags(array('bar' => array('attr' => 'baz'))) ; $container ->register('baz') + ->setTags(array('foobar' => array('attr' => 'bar'))) ->setDecoratedService('foo') ; $this->process($container); $this->assertEmpty($container->getDefinition('baz.inner')->getTags()); - $this->assertEquals(array('name' => 'bar'), $container->getDefinition('baz')->getTags()); + $this->assertEquals(array('bar' => array('attr' => 'baz'), 'foobar' => array('attr' => 'bar')), $container->getDefinition('baz')->getTags()); } protected function process(ContainerBuilder $container) From 5951378727ae4f26107899282f5ff9b89a3aa277 Mon Sep 17 00:00:00 2001 From: Robin Chalas Date: Fri, 21 Oct 2016 20:02:07 +0200 Subject: [PATCH 2/4] A decorated service should not keep the autowiring types --- .../Compiler/DecoratorServicePass.php | 2 ++ .../Compiler/DecoratorServicePassTest.php | 21 +++++++++++++++++++ .../ResolveDefinitionTemplatesPassTest.php | 7 +++++-- 3 files changed, 28 insertions(+), 2 deletions(-) diff --git a/src/Symfony/Component/DependencyInjection/Compiler/DecoratorServicePass.php b/src/Symfony/Component/DependencyInjection/Compiler/DecoratorServicePass.php index 285beda21c..391357a1fa 100644 --- a/src/Symfony/Component/DependencyInjection/Compiler/DecoratorServicePass.php +++ b/src/Symfony/Component/DependencyInjection/Compiler/DecoratorServicePass.php @@ -54,9 +54,11 @@ class DecoratorServicePass implements CompilerPassInterface } else { $decoratedDefinition = $container->getDefinition($inner); $definition->setTags($decoratedDefinition->getTags(), $definition->getTags()); + $definition->setAutowiringTypes(array_merge($decoratedDefinition->getAutowiringTypes(), $definition->getAutowiringTypes())); $public = $decoratedDefinition->isPublic(); $decoratedDefinition->setPublic(false); $decoratedDefinition->setTags(array()); + $decoratedDefinition->setAutowiringTypes(array()); $container->setDefinition($renamedId, $decoratedDefinition); } diff --git a/src/Symfony/Component/DependencyInjection/Tests/Compiler/DecoratorServicePassTest.php b/src/Symfony/Component/DependencyInjection/Tests/Compiler/DecoratorServicePassTest.php index a8b741e568..8459298268 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Compiler/DecoratorServicePassTest.php +++ b/src/Symfony/Component/DependencyInjection/Tests/Compiler/DecoratorServicePassTest.php @@ -142,6 +142,27 @@ class DecoratorServicePassTest extends \PHPUnit_Framework_TestCase $this->assertEquals(array('name' => 'bar'), $container->getDefinition('baz')->getTags()); } + public function testProcessMergesAutowiringTypesInDecoratingDefinitionAndRemoveThemFromDecoratedDefinition() + { + $container = new ContainerBuilder(); + + $container + ->register('parent') + ->addAutowiringType('Bar') + ; + + $container + ->register('child') + ->setDecoratedService('parent') + ->addAutowiringType('Foo') + ; + + $this->process($container); + + $this->assertEquals(array('Bar', 'Foo'), $container->getDefinition('child')->getAutowiringTypes()); + $this->assertEmpty($container->getDefinition('child.inner')->getAutowiringTypes()); + } + protected function process(ContainerBuilder $container) { $repeatedPass = new DecoratorServicePass(); diff --git a/src/Symfony/Component/DependencyInjection/Tests/Compiler/ResolveDefinitionTemplatesPassTest.php b/src/Symfony/Component/DependencyInjection/Tests/Compiler/ResolveDefinitionTemplatesPassTest.php index dd23e162cd..15392fbdc1 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Compiler/ResolveDefinitionTemplatesPassTest.php +++ b/src/Symfony/Component/DependencyInjection/Tests/Compiler/ResolveDefinitionTemplatesPassTest.php @@ -360,8 +360,11 @@ class ResolveDefinitionTemplatesPassTest extends \PHPUnit_Framework_TestCase $this->process($container); - $def = $container->getDefinition('child'); - $this->assertEquals(array('Foo', 'Bar'), $def->getAutowiringTypes()); + $childDef = $container->getDefinition('child'); + $this->assertEquals(array('Foo', 'Bar'), $childDef->getAutowiringTypes()); + + $parentDef = $container->getDefinition('parent'); + $this->assertSame(array('Foo'), $parentDef->getAutowiringTypes()); } protected function process(ContainerBuilder $container) From 7b56cc08767bfaa2b1a53f211fd657a8a8328c0f Mon Sep 17 00:00:00 2001 From: Fabien Potencier Date: Sun, 23 Oct 2016 22:48:00 -0700 Subject: [PATCH 3/4] removed usage of Twig_Compiler::addIndentation --- src/Symfony/Bridge/Twig/Node/DumpNode.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Symfony/Bridge/Twig/Node/DumpNode.php b/src/Symfony/Bridge/Twig/Node/DumpNode.php index a7c1529446..a66781e365 100644 --- a/src/Symfony/Bridge/Twig/Node/DumpNode.php +++ b/src/Symfony/Bridge/Twig/Node/DumpNode.php @@ -65,7 +65,7 @@ class DumpNode extends \Twig_Node ->write('\Symfony\Component\VarDumper\VarDumper::dump(array('."\n") ->indent(); foreach ($values as $node) { - $compiler->addIndentation(); + $compiler->write(''); if ($node->hasAttribute('name')) { $compiler ->string($node->getAttribute('name')) From a79991f44aac63950c6406545ef9461cfb3fbc7c Mon Sep 17 00:00:00 2001 From: Tristan Darricau Date: Mon, 24 Oct 2016 16:19:10 +0200 Subject: [PATCH 4/4] Fix edge case with StreamedResponse where headers are sent twice --- .../HttpFoundation/StreamedResponse.php | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/Symfony/Component/HttpFoundation/StreamedResponse.php b/src/Symfony/Component/HttpFoundation/StreamedResponse.php index 4b936a150e..8274dc43a0 100644 --- a/src/Symfony/Component/HttpFoundation/StreamedResponse.php +++ b/src/Symfony/Component/HttpFoundation/StreamedResponse.php @@ -28,6 +28,7 @@ class StreamedResponse extends Response { protected $callback; protected $streamed; + private $headersSent; /** * Constructor. @@ -44,6 +45,7 @@ class StreamedResponse extends Response $this->setCallback($callback); } $this->streamed = false; + $this->headersSent = false; } /** @@ -75,6 +77,22 @@ class StreamedResponse extends Response $this->callback = $callback; } + /** + * {@inheritdoc} + * + * This method only sends the headers once. + */ + public function sendHeaders() + { + if ($this->headersSent) { + return; + } + + $this->headersSent = true; + + parent::sendHeaders(); + } + /** * {@inheritdoc} *