Merge branch '2.8' into 3.1

* 2.8:
  Fix edge case with StreamedResponse where headers are sent twice
  removed usage of Twig_Compiler::addIndentation
  A decorated service should not keep the autowiring types
  merge tags instead of completely replacing them
This commit is contained in:
Fabien Potencier 2016-10-24 08:52:44 -07:00
commit dd73a100c3
5 changed files with 51 additions and 6 deletions

View File

@ -65,7 +65,7 @@ class DumpNode extends \Twig_Node
->write('\Symfony\Component\VarDumper\VarDumper::dump(array('."\n") ->write('\Symfony\Component\VarDumper\VarDumper::dump(array('."\n")
->indent(); ->indent();
foreach ($values as $node) { foreach ($values as $node) {
$compiler->addIndentation(); $compiler->write('');
if ($node->hasAttribute('name')) { if ($node->hasAttribute('name')) {
$compiler $compiler
->string($node->getAttribute('name')) ->string($node->getAttribute('name'))

View File

@ -52,10 +52,12 @@ class DecoratorServicePass implements CompilerPassInterface
$container->setAlias($renamedId, new Alias((string) $alias, false)); $container->setAlias($renamedId, new Alias((string) $alias, false));
} else { } else {
$decoratedDefinition = $container->getDefinition($inner); $decoratedDefinition = $container->getDefinition($inner);
$definition->setTags($decoratedDefinition->getTags(), $definition->getTags()); $definition->setTags(array_merge($decoratedDefinition->getTags(), $definition->getTags()));
$definition->setAutowiringTypes(array_merge($decoratedDefinition->getAutowiringTypes(), $definition->getAutowiringTypes()));
$public = $decoratedDefinition->isPublic(); $public = $decoratedDefinition->isPublic();
$decoratedDefinition->setPublic(false); $decoratedDefinition->setPublic(false);
$decoratedDefinition->setTags(array()); $decoratedDefinition->setTags(array());
$decoratedDefinition->setAutowiringTypes(array());
$container->setDefinition($renamedId, $decoratedDefinition); $container->setDefinition($renamedId, $decoratedDefinition);
} }

View File

@ -129,17 +129,39 @@ class DecoratorServicePassTest extends \PHPUnit_Framework_TestCase
$container = new ContainerBuilder(); $container = new ContainerBuilder();
$container $container
->register('foo') ->register('foo')
->setTags(array('name' => 'bar')) ->setTags(array('bar' => array('attr' => 'baz')))
; ;
$container $container
->register('baz') ->register('baz')
->setTags(array('foobar' => array('attr' => 'bar')))
->setDecoratedService('foo') ->setDecoratedService('foo')
; ;
$this->process($container); $this->process($container);
$this->assertEmpty($container->getDefinition('baz.inner')->getTags()); $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());
}
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) protected function process(ContainerBuilder $container)

View File

@ -337,8 +337,11 @@ class ResolveDefinitionTemplatesPassTest extends \PHPUnit_Framework_TestCase
$this->process($container); $this->process($container);
$def = $container->getDefinition('child'); $childDef = $container->getDefinition('child');
$this->assertEquals(array('Foo', 'Bar'), $def->getAutowiringTypes()); $this->assertEquals(array('Foo', 'Bar'), $childDef->getAutowiringTypes());
$parentDef = $container->getDefinition('parent');
$this->assertSame(array('Foo'), $parentDef->getAutowiringTypes());
} }
public function testProcessResolvesAliases() public function testProcessResolvesAliases()

View File

@ -28,6 +28,7 @@ class StreamedResponse extends Response
{ {
protected $callback; protected $callback;
protected $streamed; protected $streamed;
private $headersSent;
/** /**
* Constructor. * Constructor.
@ -44,6 +45,7 @@ class StreamedResponse extends Response
$this->setCallback($callback); $this->setCallback($callback);
} }
$this->streamed = false; $this->streamed = false;
$this->headersSent = false;
} }
/** /**
@ -70,6 +72,22 @@ class StreamedResponse extends Response
$this->callback = $callback; $this->callback = $callback;
} }
/**
* {@inheritdoc}
*
* This method only sends the headers once.
*/
public function sendHeaders()
{
if ($this->headersSent) {
return;
}
$this->headersSent = true;
parent::sendHeaders();
}
/** /**
* {@inheritdoc} * {@inheritdoc}
* *