Merge branch '2.7' into 2.8

* 2.7:
  [DI] Remove unused props from the PhpDumper
  [ProxyManager] Cleanup fixtures
  [Debug] HTML-escape array key
  Add some phpdocs for IDE autocompletion and better SCA
This commit is contained in:
Nicolas Grekas 2017-07-28 17:21:22 +02:00
commit 4fe888906e
9 changed files with 54 additions and 418 deletions

View File

@ -25,6 +25,39 @@ use Symfony\Component\DependencyInjection\Dumper\PhpDumper;
class PhpDumperTest extends TestCase
{
public function testDumpContainerWithProxyService()
{
$this->assertStringMatchesFormatFile(
__DIR__.'/../Fixtures/php/lazy_service_structure.txt',
$this->dumpLazyServiceProjectServiceContainer(),
'->dump() does generate proxy lazy loading logic.'
);
}
/**
* Verifies that the generated container retrieves the same proxy instance on multiple subsequent requests.
*/
public function testDumpContainerWithProxyServiceWillShareProxies()
{
if (!class_exists('LazyServiceProjectServiceContainer', false)) {
eval('?>'.$this->dumpLazyServiceProjectServiceContainer());
}
$container = new \LazyServiceProjectServiceContainer();
$proxy = $container->get('foo');
$this->assertInstanceOf('stdClass', $proxy);
$this->assertInstanceOf('ProxyManager\Proxy\LazyLoadingInterface', $proxy);
$this->assertSame($proxy, $container->get('foo'));
$this->assertFalse($proxy->isProxyInitialized());
$proxy->initializeProxy();
$this->assertTrue($proxy->isProxyInitialized());
$this->assertSame($proxy, $container->get('foo'));
}
private function dumpLazyServiceProjectServiceContainer()
{
$container = new ContainerBuilder();
@ -36,39 +69,6 @@ class PhpDumperTest extends TestCase
$dumper->setProxyDumper(new ProxyDumper());
$dumpedString = $dumper->dump();
$this->assertStringMatchesFormatFile(
__DIR__.'/../Fixtures/php/lazy_service_structure.txt',
$dumpedString,
'->dump() does generate proxy lazy loading logic.'
);
}
/**
* Verifies that the generated container retrieves the same proxy instance on multiple subsequent requests.
*/
public function testDumpContainerWithProxyServiceWillShareProxies()
{
// detecting ProxyManager v2
if (class_exists('ProxyManager\ProxyGenerator\LazyLoading\MethodGenerator\StaticProxyConstructor')) {
require_once __DIR__.'/../Fixtures/php/lazy_service_with_hints.php';
} else {
require_once __DIR__.'/../Fixtures/php/lazy_service.php';
}
$container = new \LazyServiceProjectServiceContainer();
/* @var $proxy \stdClass_c1d194250ee2e2b7d2eab8b8212368a8 */
$proxy = $container->get('foo');
$this->assertInstanceOf('stdClass_c1d194250ee2e2b7d2eab8b8212368a8', $proxy);
$this->assertSame($proxy, $container->get('foo'));
$this->assertFalse($proxy->isProxyInitialized());
$proxy->initializeProxy();
$this->assertTrue($proxy->isProxyInitialized());
$this->assertSame($proxy, $container->get('foo'));
return $dumper->dump(array('class' => 'LazyServiceProjectServiceContainer'));
}
}

View File

@ -1,185 +0,0 @@
<?php
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Container;
use Symfony\Component\DependencyInjection\Exception\InactiveScopeException;
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
use Symfony\Component\DependencyInjection\Exception\LogicException;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;
use Symfony\Component\DependencyInjection\Reference;
use Symfony\Component\DependencyInjection\Parameter;
use Symfony\Component\DependencyInjection\ParameterBag\FrozenParameterBag;
/**
* ProjectServiceContainer.
*
* This class has been auto-generated
* by the Symfony Dependency Injection Component.
*/
class LazyServiceProjectServiceContainer extends Container
{
/**
* Constructor.
*/
public function __construct()
{
$this->services =
$this->scopedServices =
$this->scopeStacks = array();
$this->scopes = array();
$this->scopeChildren = array();
}
/**
* Gets the 'foo' service.
*
* This service is shared.
* This method always returns the same instance of the service.
*
* @param bool $lazyLoad whether to try lazy-loading the service with a proxy
*
* @return stdClass A stdClass instance
*/
public function getFooService($lazyLoad = true)
{
if ($lazyLoad) {
$container = $this;
return $this->services['foo'] = new stdClass_c1d194250ee2e2b7d2eab8b8212368a8(
function (&$wrappedInstance, \ProxyManager\Proxy\LazyLoadingInterface $proxy) use ($container) {
$wrappedInstance = $container->getFooService(false);
$proxy->setProxyInitializer(null);
return true;
}
);
}
return new \stdClass();
}
}
class stdClass_c1d194250ee2e2b7d2eab8b8212368a8 extends \stdClass implements \ProxyManager\Proxy\LazyLoadingInterface, \ProxyManager\Proxy\ValueHolderInterface
{
/**
* @var \Closure|null initializer responsible for generating the wrapped object
*/
private $valueHolder5157dd96e88c0 = null;
/**
* @var \Closure|null initializer responsible for generating the wrapped object
*/
private $initializer5157dd96e8924 = null;
/**
* @override constructor for lazy initialization
*
* @param \Closure|null $initializer
*/
public function __construct($initializer)
{
$this->initializer5157dd96e8924 = $initializer;
}
/**
* @param string $name
*/
public function __get($name)
{
$this->initializer5157dd96e8924 && $this->initializer5157dd96e8924->__invoke($this->valueHolder5157dd96e88c0, $this, '__get', array('name' => $name));
return $this->valueHolder5157dd96e88c0->$name;
}
/**
* @param string $name
* @param mixed $value
*/
public function __set($name, $value)
{
$this->initializer5157dd96e8924 && $this->initializer5157dd96e8924->__invoke($this->valueHolder5157dd96e88c0, $this, '__set', array('name' => $name, 'value' => $value));
$this->valueHolder5157dd96e88c0->$name = $value;
}
/**
* @param string $name
*
* @return bool
*/
public function __isset($name)
{
$this->initializer5157dd96e8924 && $this->initializer5157dd96e8924->__invoke($this->valueHolder5157dd96e88c0, $this, '__isset', array('name' => $name));
return isset($this->valueHolder5157dd96e88c0->$name);
}
/**
* @param string $name
*/
public function __unset($name)
{
$this->initializer5157dd96e8924 && $this->initializer5157dd96e8924->__invoke($this->valueHolder5157dd96e88c0, $this, '__unset', array('name' => $name));
unset($this->valueHolder5157dd96e88c0->$name);
}
public function __clone()
{
$this->initializer5157dd96e8924 && $this->initializer5157dd96e8924->__invoke($this->valueHolder5157dd96e88c0, $this, '__clone', array());
$this->valueHolder5157dd96e88c0 = clone $this->valueHolder5157dd96e88c0;
}
public function __sleep()
{
$this->initializer5157dd96e8924 && $this->initializer5157dd96e8924->__invoke($this->valueHolder5157dd96e88c0, $this, '__sleep', array());
return array('valueHolder5157dd96e88c0');
}
public function __wakeup()
{
}
/**
* {@inheritdoc}
*/
public function setProxyInitializer(\Closure $initializer = null)
{
$this->initializer5157dd96e8924 = $initializer;
}
/**
* {@inheritdoc}
*/
public function getProxyInitializer()
{
return $this->initializer5157dd96e8924;
}
/**
* {@inheritdoc}
*/
public function initializeProxy()
{
return $this->initializer5157dd96e8924 && $this->initializer5157dd96e8924->__invoke($this->valueHolder5157dd96e88c0, $this, 'initializeProxy', array());
}
/**
* {@inheritdoc}
*/
public function isProxyInitialized()
{
return null !== $this->valueHolder5157dd96e88c0;
}
/**
* {@inheritdoc}
*/
public function getWrappedValueHolderValue()
{
return $this->valueHolder5157dd96e88c0;
}
}

View File

@ -1,7 +1,7 @@
<?php
use %a
class ProjectServiceContainer extends Container
class LazyServiceProjectServiceContainer extends Container
{%a
public function getFooService($lazyLoad = true)
{

View File

@ -1,180 +0,0 @@
<?php
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Container;
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
use Symfony\Component\DependencyInjection\Exception\LogicException;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;
use Symfony\Component\DependencyInjection\Reference;
use Symfony\Component\DependencyInjection\Parameter;
use Symfony\Component\DependencyInjection\ParameterBag\FrozenParameterBag;
/**
* ProjectServiceContainer.
*
* This class has been auto-generated
* by the Symfony Dependency Injection Component.
*/
class LazyServiceProjectServiceContainer extends Container
{
/**
* Constructor.
*/
public function __construct()
{
$this->services = array();
}
/**
* Gets the 'foo' service.
*
* This service is shared.
* This method always returns the same instance of the service.
*
* @param bool $lazyLoad whether to try lazy-loading the service with a proxy
*
* @return stdClass A stdClass instance
*/
public function getFooService($lazyLoad = true)
{
if ($lazyLoad) {
$container = $this;
return $this->services['foo'] = new stdClass_c1d194250ee2e2b7d2eab8b8212368a8(
function (&$wrappedInstance, \ProxyManager\Proxy\LazyLoadingInterface $proxy) use ($container) {
$wrappedInstance = $this->getFooService(false);
$proxy->setProxyInitializer(null);
return true;
}
);
}
return new \stdClass();
}
}
class stdClass_c1d194250ee2e2b7d2eab8b8212368a8 extends \stdClass implements \ProxyManager\Proxy\LazyLoadingInterface, \ProxyManager\Proxy\ValueHolderInterface
{
/**
* @var \Closure|null initializer responsible for generating the wrapped object
*/
private $valueHolder5157dd96e88c0 = null;
/**
* @var \Closure|null initializer responsible for generating the wrapped object
*/
private $initializer5157dd96e8924 = null;
/**
* @override constructor for lazy initialization
*
* @param \Closure|null $initializer
*/
public function __construct($initializer)
{
$this->initializer5157dd96e8924 = $initializer;
}
/**
* @param string $name
*/
public function __get($name)
{
$this->initializer5157dd96e8924 && $this->initializer5157dd96e8924->__invoke($this->valueHolder5157dd96e88c0, $this, '__get', array('name' => $name));
return $this->valueHolder5157dd96e88c0->$name;
}
/**
* @param string $name
* @param mixed $value
*/
public function __set($name, $value)
{
$this->initializer5157dd96e8924 && $this->initializer5157dd96e8924->__invoke($this->valueHolder5157dd96e88c0, $this, '__set', array('name' => $name, 'value' => $value));
$this->valueHolder5157dd96e88c0->$name = $value;
}
/**
* @param string $name
*
* @return bool
*/
public function __isset($name)
{
$this->initializer5157dd96e8924 && $this->initializer5157dd96e8924->__invoke($this->valueHolder5157dd96e88c0, $this, '__isset', array('name' => $name));
return isset($this->valueHolder5157dd96e88c0->$name);
}
/**
* @param string $name
*/
public function __unset($name)
{
$this->initializer5157dd96e8924 && $this->initializer5157dd96e8924->__invoke($this->valueHolder5157dd96e88c0, $this, '__unset', array('name' => $name));
unset($this->valueHolder5157dd96e88c0->$name);
}
public function __clone()
{
$this->initializer5157dd96e8924 && $this->initializer5157dd96e8924->__invoke($this->valueHolder5157dd96e88c0, $this, '__clone', array());
$this->valueHolder5157dd96e88c0 = clone $this->valueHolder5157dd96e88c0;
}
public function __sleep()
{
$this->initializer5157dd96e8924 && $this->initializer5157dd96e8924->__invoke($this->valueHolder5157dd96e88c0, $this, '__sleep', array());
return array('valueHolder5157dd96e88c0');
}
public function __wakeup()
{
}
/**
* {@inheritdoc}
*/
public function setProxyInitializer(\Closure $initializer = null)
{
$this->initializer5157dd96e8924 = $initializer;
}
/**
* {@inheritdoc}
*/
public function getProxyInitializer()
{
return $this->initializer5157dd96e8924;
}
/**
* {@inheritdoc}
*/
public function initializeProxy(): bool
{
return $this->initializer5157dd96e8924 && $this->initializer5157dd96e8924->__invoke($this->valueHolder5157dd96e88c0, $this, 'initializeProxy', array());
}
/**
* {@inheritdoc}
*/
public function isProxyInitialized(): bool
{
return null !== $this->valueHolder5157dd96e88c0;
}
/**
* {@inheritdoc}
*/
public function getWrappedValueHolderValue()
{
return $this->valueHolder5157dd96e88c0;
}
}

View File

@ -442,7 +442,7 @@ EOF;
$formattedValue = str_replace("\n", '', var_export($this->escapeHtml((string) $item[1]), true));
}
$result[] = is_int($key) ? $formattedValue : sprintf("'%s' => %s", $key, $formattedValue);
$result[] = is_int($key) ? $formattedValue : sprintf("'%s' => %s", $this->escapeHtml($key), $formattedValue);
}
return implode(', ', $result);

View File

@ -255,12 +255,11 @@ class PhpDumper extends Dumper
/**
* Generates the require_once statement for service includes.
*
* @param string $id The service id
* @param Definition $definition
*
* @return string
*/
private function addServiceInclude($id, $definition)
private function addServiceInclude($definition)
{
$template = " require_once %s;\n";
$code = '';
@ -335,9 +334,9 @@ class PhpDumper extends Dumper
$code .= $this->addNewInstance($id, $sDefinition, '$'.$name, ' = ');
if (!$this->hasReference($id, $sDefinition->getMethodCalls(), true) && !$this->hasReference($id, $sDefinition->getProperties(), true)) {
$code .= $this->addServiceProperties(null, $sDefinition, $name);
$code .= $this->addServiceMethodCalls(null, $sDefinition, $name);
$code .= $this->addServiceConfigurator(null, $sDefinition, $name);
$code .= $this->addServiceProperties($sDefinition, $name);
$code .= $this->addServiceMethodCalls($sDefinition, $name);
$code .= $this->addServiceConfigurator($sDefinition, $name);
}
$code .= "\n";
@ -437,13 +436,12 @@ class PhpDumper extends Dumper
/**
* Adds method calls to a service definition.
*
* @param string $id
* @param Definition $definition
* @param string $variableName
*
* @return string
*/
private function addServiceMethodCalls($id, Definition $definition, $variableName = 'instance')
private function addServiceMethodCalls(Definition $definition, $variableName = 'instance')
{
$calls = '';
foreach ($definition->getMethodCalls() as $call) {
@ -458,7 +456,7 @@ class PhpDumper extends Dumper
return $calls;
}
private function addServiceProperties($id, Definition $definition, $variableName = 'instance')
private function addServiceProperties(Definition $definition, $variableName = 'instance')
{
$code = '';
foreach ($definition->getProperties() as $name => $value) {
@ -501,9 +499,9 @@ class PhpDumper extends Dumper
}
$name = (string) $this->definitionVariables->offsetGet($iDefinition);
$code .= $this->addServiceProperties(null, $iDefinition, $name);
$code .= $this->addServiceMethodCalls(null, $iDefinition, $name);
$code .= $this->addServiceConfigurator(null, $iDefinition, $name);
$code .= $this->addServiceProperties($iDefinition, $name);
$code .= $this->addServiceMethodCalls($iDefinition, $name);
$code .= $this->addServiceConfigurator($iDefinition, $name);
}
if ('' !== $code) {
@ -516,13 +514,12 @@ class PhpDumper extends Dumper
/**
* Adds configurator definition.
*
* @param string $id
* @param Definition $definition
* @param string $variableName
*
* @return string
*/
private function addServiceConfigurator($id, Definition $definition, $variableName = 'instance')
private function addServiceConfigurator(Definition $definition, $variableName = 'instance')
{
if (!$callable = $definition->getConfigurator()) {
return '';
@ -646,14 +643,14 @@ EOF;
}
$code .=
$this->addServiceInclude($id, $definition).
$this->addServiceInclude($definition).
$this->addServiceLocalTempVariables($id, $definition).
$this->addServiceInlinedDefinitions($id, $definition).
$this->addServiceInstance($id, $definition).
$this->addServiceInlinedDefinitionsSetup($id, $definition).
$this->addServiceProperties($id, $definition).
$this->addServiceMethodCalls($id, $definition).
$this->addServiceConfigurator($id, $definition).
$this->addServiceProperties($definition).
$this->addServiceMethodCalls($definition).
$this->addServiceConfigurator($definition).
$this->addServiceReturn($id, $definition)
;
}

View File

@ -15,6 +15,7 @@ use Symfony\Component\Form\FormEvents;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\Exception\UnexpectedTypeException;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Form\FormInterface;
/**
* Resize a collection form element based on the data sent from the client.
@ -146,6 +147,7 @@ class ResizeFormListener implements EventSubscriberInterface
if ($this->deleteEmpty) {
$previousData = $event->getForm()->getData();
/** @var FormInterface $child */
foreach ($form as $name => $child) {
$isNew = !isset($previousData[$name]);

View File

@ -120,6 +120,7 @@ class ChoiceType extends AbstractType
// Reconstruct the data as mapping from child names to values
$data = array();
/** @var FormInterface $child */
foreach ($form as $child) {
$value = $child->getConfig()->getOption('value');

View File

@ -98,6 +98,7 @@ class FormValidator extends ConstraintValidator
} else {
$childrenSynchronized = true;
/** @var FormInterface $child */
foreach ($form as $child) {
if (!$child->isSynchronized()) {
$childrenSynchronized = false;