From 38f4f83a5c12fcccdc9ec857c5e6d07d36a38f20 Mon Sep 17 00:00:00 2001 From: Pierre du Plessis Date: Sun, 1 Oct 2017 10:07:08 +0200 Subject: [PATCH 01/13] Prevent forms from having itself as a parent --- src/Symfony/Component/Form/FormRegistry.php | 9 ++++++ .../FormWithSameParentTypeAsObject.php | 27 ++++++++++++++++++ .../FormWithSameParentTypeAsString.php | 27 ++++++++++++++++++ .../Component/Form/Tests/FormRegistryTest.php | 28 +++++++++++++++++++ 4 files changed, 91 insertions(+) create mode 100644 src/Symfony/Component/Form/Tests/Fixtures/FormWithSameParentTypeAsObject.php create mode 100644 src/Symfony/Component/Form/Tests/Fixtures/FormWithSameParentTypeAsString.php diff --git a/src/Symfony/Component/Form/FormRegistry.php b/src/Symfony/Component/Form/FormRegistry.php index 6e00755378f5a..dbbba0d1dedc9 100644 --- a/src/Symfony/Component/Form/FormRegistry.php +++ b/src/Symfony/Component/Form/FormRegistry.php @@ -12,6 +12,7 @@ namespace Symfony\Component\Form; use Symfony\Component\Form\Exception\ExceptionInterface; +use Symfony\Component\Form\Exception\LogicException; use Symfony\Component\Form\Exception\UnexpectedTypeException; use Symfony\Component\Form\Exception\InvalidArgumentException; @@ -102,6 +103,14 @@ public function getType($name) */ private function resolveType(FormTypeInterface $type) { + if ($parentType->getName() === $type->getName()) { + throw new LogicException(sprintf('Form "%s" cannot have itself as a parent.', $type->getName())); + } + + } + + if ($parentType === $type->getName()) { + throw new LogicException(sprintf('Form "%s" cannot have itself as a parent.', $type->getName())); $typeExtensions = array(); $parentType = $type->getParent(); $fqcn = get_class($type); diff --git a/src/Symfony/Component/Form/Tests/Fixtures/FormWithSameParentTypeAsObject.php b/src/Symfony/Component/Form/Tests/Fixtures/FormWithSameParentTypeAsObject.php new file mode 100644 index 0000000000000..f446f3d0ffaa1 --- /dev/null +++ b/src/Symfony/Component/Form/Tests/Fixtures/FormWithSameParentTypeAsObject.php @@ -0,0 +1,27 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Form\Tests\Fixtures; + +use Symfony\Component\Form\AbstractType; + +class FormWithSameParentTypeAsObject extends AbstractType +{ + public function getName() + { + return 'foo_type'; + } + + public function getParent() + { + return new FormWithSameParentTypeAsObject(); + } +} diff --git a/src/Symfony/Component/Form/Tests/Fixtures/FormWithSameParentTypeAsString.php b/src/Symfony/Component/Form/Tests/Fixtures/FormWithSameParentTypeAsString.php new file mode 100644 index 0000000000000..9196e68bbb8e8 --- /dev/null +++ b/src/Symfony/Component/Form/Tests/Fixtures/FormWithSameParentTypeAsString.php @@ -0,0 +1,27 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Form\Tests\Fixtures; + +use Symfony\Component\Form\AbstractType; + +class FormWithSameParentTypeAsString extends AbstractType +{ + public function getName() + { + return 'foo_type'; + } + + public function getParent() + { + return 'foo_type'; + } +} diff --git a/src/Symfony/Component/Form/Tests/FormRegistryTest.php b/src/Symfony/Component/Form/Tests/FormRegistryTest.php index 5deddff422b42..ba1675360f350 100644 --- a/src/Symfony/Component/Form/Tests/FormRegistryTest.php +++ b/src/Symfony/Component/Form/Tests/FormRegistryTest.php @@ -16,6 +16,8 @@ use Symfony\Component\Form\FormTypeGuesserChain; use Symfony\Component\Form\ResolvedFormType; use Symfony\Component\Form\ResolvedFormTypeFactoryInterface; +use Symfony\Component\Form\Tests\Fixtures\FormWithSameParentTypeAsObject; +use Symfony\Component\Form\Tests\Fixtures\FormWithSameParentTypeAsString; use Symfony\Component\Form\Tests\Fixtures\FooSubType; use Symfony\Component\Form\Tests\Fixtures\FooType; use Symfony\Component\Form\Tests\Fixtures\FooTypeBarExtension; @@ -156,6 +158,32 @@ public function testGetTypeConnectsParent() $this->assertSame($resolvedType, $this->registry->getType(get_class($type))); } + /** + * @expectedException \Symfony\Component\Form\Exception\LogicException + * @expectedExceptionMessage Form "foo_type" cannot have itself as a parent. + */ + public function testFormCannotHaveItselfAsAParent() + { + $type = new FormWithSameParentTypeAsString(); + + $this->extension2->addType($type); + + $this->registry->getType('foo_type'); + } + + /** + * @expectedException \Symfony\Component\Form\Exception\LogicException + * @expectedExceptionMessage Form "foo_type" cannot have itself as a parent. + */ + public function testFormCannotHaveItselfAsAParentIfGetParentReturnsInstance() + { + $type = new FormWithSameParentTypeAsObject(); + + $this->extension2->addType($type); + + $this->registry->getType('foo_type'); + } + /** * @expectedException \Symfony\Component\Form\Exception\InvalidArgumentException */ From 5d33c27d738b564cd79bd7e58a865c761de32bfd Mon Sep 17 00:00:00 2001 From: Pierre du Plessis Date: Mon, 2 Oct 2017 13:25:45 +0200 Subject: [PATCH 02/13] Return new self instead of class name --- .../Form/Tests/Fixtures/FormWithSameParentTypeAsObject.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Symfony/Component/Form/Tests/Fixtures/FormWithSameParentTypeAsObject.php b/src/Symfony/Component/Form/Tests/Fixtures/FormWithSameParentTypeAsObject.php index f446f3d0ffaa1..3fbf9c876ec63 100644 --- a/src/Symfony/Component/Form/Tests/Fixtures/FormWithSameParentTypeAsObject.php +++ b/src/Symfony/Component/Form/Tests/Fixtures/FormWithSameParentTypeAsObject.php @@ -22,6 +22,6 @@ public function getName() public function getParent() { - return new FormWithSameParentTypeAsObject(); + return new self(); } } From 9d7cb13c24430c5a1e13cb02a15ff795490881a8 Mon Sep 17 00:00:00 2001 From: Pierre du Plessis Date: Tue, 3 Oct 2017 09:21:46 +0200 Subject: [PATCH 03/13] Handle circular form dependencies --- src/Symfony/Component/Form/FormRegistry.php | 15 +++++++ .../Fixtures/RecursiveFormTypeObjectBar.php | 27 +++++++++++++ .../Fixtures/RecursiveFormTypeObjectBaz.php | 27 +++++++++++++ .../Fixtures/RecursiveFormTypeObjectFoo.php | 27 +++++++++++++ .../Fixtures/RecursiveFormTypeStringBar.php | 27 +++++++++++++ .../Fixtures/RecursiveFormTypeStringBaz.php | 27 +++++++++++++ .../Fixtures/RecursiveFormTypeStringFoo.php | 27 +++++++++++++ .../Component/Form/Tests/FormRegistryTest.php | 40 +++++++++++++++++++ 8 files changed, 217 insertions(+) create mode 100644 src/Symfony/Component/Form/Tests/Fixtures/RecursiveFormTypeObjectBar.php create mode 100644 src/Symfony/Component/Form/Tests/Fixtures/RecursiveFormTypeObjectBaz.php create mode 100644 src/Symfony/Component/Form/Tests/Fixtures/RecursiveFormTypeObjectFoo.php create mode 100644 src/Symfony/Component/Form/Tests/Fixtures/RecursiveFormTypeStringBar.php create mode 100644 src/Symfony/Component/Form/Tests/Fixtures/RecursiveFormTypeStringBaz.php create mode 100644 src/Symfony/Component/Form/Tests/Fixtures/RecursiveFormTypeStringFoo.php diff --git a/src/Symfony/Component/Form/FormRegistry.php b/src/Symfony/Component/Form/FormRegistry.php index dbbba0d1dedc9..83e9a30def984 100644 --- a/src/Symfony/Component/Form/FormRegistry.php +++ b/src/Symfony/Component/Form/FormRegistry.php @@ -103,13 +103,26 @@ public function getType($name) */ private function resolveType(FormTypeInterface $type) { + static $checkedTypes = array(); + + $searchKey = array_search($type->getName(), $checkedTypes); + $checkedTypes[] = $type->getName(); + + if (false !== $searchKey) { + $types = implode(' > ', $checkedTypes); + $checkedTypes = array(); + throw new LogicException(sprintf('Circular reference detected for form "%s" (%s).', $type->getName(), $types)); + } + if ($parentType->getName() === $type->getName()) { + $checkedTypes = array(); throw new LogicException(sprintf('Form "%s" cannot have itself as a parent.', $type->getName())); } } if ($parentType === $type->getName()) { + $checkedTypes = array(); throw new LogicException(sprintf('Form "%s" cannot have itself as a parent.', $type->getName())); $typeExtensions = array(); $parentType = $type->getParent(); @@ -127,6 +140,8 @@ private function resolveType(FormTypeInterface $type) $typeExtensions, $parentType ? $this->getType($parentType) : null ); + + unset($checkedTypes[array_search($type->getName(), $checkedTypes)]); } /** diff --git a/src/Symfony/Component/Form/Tests/Fixtures/RecursiveFormTypeObjectBar.php b/src/Symfony/Component/Form/Tests/Fixtures/RecursiveFormTypeObjectBar.php new file mode 100644 index 0000000000000..aa2f2ae1f38a2 --- /dev/null +++ b/src/Symfony/Component/Form/Tests/Fixtures/RecursiveFormTypeObjectBar.php @@ -0,0 +1,27 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Form\Tests\Fixtures; + +use Symfony\Component\Form\AbstractType; + +class RecursiveFormTypeObjectBar extends AbstractType +{ + public function getParent() + { + return new RecursiveFormTypeObjectBaz(); + } + + public function getName() + { + return 'bar_object_type'; + } +} diff --git a/src/Symfony/Component/Form/Tests/Fixtures/RecursiveFormTypeObjectBaz.php b/src/Symfony/Component/Form/Tests/Fixtures/RecursiveFormTypeObjectBaz.php new file mode 100644 index 0000000000000..47c0ad2a6ffa6 --- /dev/null +++ b/src/Symfony/Component/Form/Tests/Fixtures/RecursiveFormTypeObjectBaz.php @@ -0,0 +1,27 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Form\Tests\Fixtures; + +use Symfony\Component\Form\AbstractType; + +class RecursiveFormTypeObjectBaz extends AbstractType +{ + public function getParent() + { + return new RecursiveFormTypeObjectFoo(); + } + + public function getName() + { + return 'baz_object_type'; + } +} diff --git a/src/Symfony/Component/Form/Tests/Fixtures/RecursiveFormTypeObjectFoo.php b/src/Symfony/Component/Form/Tests/Fixtures/RecursiveFormTypeObjectFoo.php new file mode 100644 index 0000000000000..7b590463941ce --- /dev/null +++ b/src/Symfony/Component/Form/Tests/Fixtures/RecursiveFormTypeObjectFoo.php @@ -0,0 +1,27 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Form\Tests\Fixtures; + +use Symfony\Component\Form\AbstractType; + +class RecursiveFormTypeObjectFoo extends AbstractType +{ + public function getParent() + { + return new RecursiveFormTypeObjectBar(); + } + + public function getName() + { + return 'foo_object_type'; + } +} diff --git a/src/Symfony/Component/Form/Tests/Fixtures/RecursiveFormTypeStringBar.php b/src/Symfony/Component/Form/Tests/Fixtures/RecursiveFormTypeStringBar.php new file mode 100644 index 0000000000000..a2723848971b7 --- /dev/null +++ b/src/Symfony/Component/Form/Tests/Fixtures/RecursiveFormTypeStringBar.php @@ -0,0 +1,27 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Form\Tests\Fixtures; + +use Symfony\Component\Form\AbstractType; + +class RecursiveFormTypeStringBar extends AbstractType +{ + public function getParent() + { + return 'baz_string_type'; + } + + public function getName() + { + return 'bar_string_type'; + } +} diff --git a/src/Symfony/Component/Form/Tests/Fixtures/RecursiveFormTypeStringBaz.php b/src/Symfony/Component/Form/Tests/Fixtures/RecursiveFormTypeStringBaz.php new file mode 100644 index 0000000000000..f56606f95c343 --- /dev/null +++ b/src/Symfony/Component/Form/Tests/Fixtures/RecursiveFormTypeStringBaz.php @@ -0,0 +1,27 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Form\Tests\Fixtures; + +use Symfony\Component\Form\AbstractType; + +class RecursiveFormTypeStringBaz extends AbstractType +{ + public function getParent() + { + return 'foo_string_type'; + } + + public function getName() + { + return 'baz_string_type'; + } +} diff --git a/src/Symfony/Component/Form/Tests/Fixtures/RecursiveFormTypeStringFoo.php b/src/Symfony/Component/Form/Tests/Fixtures/RecursiveFormTypeStringFoo.php new file mode 100644 index 0000000000000..826a974d23a94 --- /dev/null +++ b/src/Symfony/Component/Form/Tests/Fixtures/RecursiveFormTypeStringFoo.php @@ -0,0 +1,27 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Form\Tests\Fixtures; + +use Symfony\Component\Form\AbstractType; + +class RecursiveFormTypeStringFoo extends AbstractType +{ + public function getParent() + { + return 'bar_string_type'; + } + + public function getName() + { + return 'foo_string_type'; + } +} diff --git a/src/Symfony/Component/Form/Tests/FormRegistryTest.php b/src/Symfony/Component/Form/Tests/FormRegistryTest.php index ba1675360f350..506858e7b6973 100644 --- a/src/Symfony/Component/Form/Tests/FormRegistryTest.php +++ b/src/Symfony/Component/Form/Tests/FormRegistryTest.php @@ -18,6 +18,12 @@ use Symfony\Component\Form\ResolvedFormTypeFactoryInterface; use Symfony\Component\Form\Tests\Fixtures\FormWithSameParentTypeAsObject; use Symfony\Component\Form\Tests\Fixtures\FormWithSameParentTypeAsString; +use Symfony\Component\Form\Tests\Fixtures\RecursiveFormTypeObjectBar; +use Symfony\Component\Form\Tests\Fixtures\RecursiveFormTypeObjectBaz; +use Symfony\Component\Form\Tests\Fixtures\RecursiveFormTypeObjectFoo; +use Symfony\Component\Form\Tests\Fixtures\RecursiveFormTypeStringBar; +use Symfony\Component\Form\Tests\Fixtures\RecursiveFormTypeStringBaz; +use Symfony\Component\Form\Tests\Fixtures\RecursiveFormTypeStringFoo; use Symfony\Component\Form\Tests\Fixtures\FooSubType; use Symfony\Component\Form\Tests\Fixtures\FooType; use Symfony\Component\Form\Tests\Fixtures\FooTypeBarExtension; @@ -184,6 +190,40 @@ public function testFormCannotHaveItselfAsAParentIfGetParentReturnsInstance() $this->registry->getType('foo_type'); } + /** + * @expectedException \Symfony\Component\Form\Exception\LogicException + * @expectedExceptionMessage Circular reference detected for form "foo_string_type" (foo_string_type > bar_string_type > baz_string_type > foo_string_type). + */ + public function testRecursiveFormDependenciesWithStringParent() + { + $foo = new RecursiveFormTypeStringFoo(); + $bar = new RecursiveFormTypeStringBar(); + $baz = new RecursiveFormTypeStringBaz(); + + $this->extension2->addType($foo); + $this->extension2->addType($bar); + $this->extension2->addType($baz); + + $this->registry->getType('foo_string_type'); + } + + /** + * @expectedException \Symfony\Component\Form\Exception\LogicException + * @expectedExceptionMessage Circular reference detected for form "foo_object_type" (foo_object_type > bar_object_type > baz_object_type > foo_object_type). + */ + public function testRecursiveFormDependenciesWithObjectParent() + { + $foo = new RecursiveFormTypeObjectFoo(); + $bar = new RecursiveFormTypeObjectBar(); + $baz = new RecursiveFormTypeObjectBaz(); + + $this->extension2->addType($foo); + $this->extension2->addType($bar); + $this->extension2->addType($baz); + + $this->registry->getType('foo_object_type'); + } + /** * @expectedException \Symfony\Component\Form\Exception\InvalidArgumentException */ From c1bf6cb5263f4b182cbec9f0f886be895940e945 Mon Sep 17 00:00:00 2001 From: Pierre du Plessis Date: Sun, 8 Oct 2017 11:33:49 +0200 Subject: [PATCH 04/13] Add form name as key to checkedTypes --- src/Symfony/Component/Form/FormRegistry.php | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/Symfony/Component/Form/FormRegistry.php b/src/Symfony/Component/Form/FormRegistry.php index 83e9a30def984..16e7985fa4f5a 100644 --- a/src/Symfony/Component/Form/FormRegistry.php +++ b/src/Symfony/Component/Form/FormRegistry.php @@ -105,15 +105,14 @@ private function resolveType(FormTypeInterface $type) { static $checkedTypes = array(); - $searchKey = array_search($type->getName(), $checkedTypes); - $checkedTypes[] = $type->getName(); - - if (false !== $searchKey) { - $types = implode(' > ', $checkedTypes); + if (isset($checkedTypes[$type->getName()])) { + $types = implode(' > ', array_merge(array_keys($checkedTypes), array($type->getName()))); $checkedTypes = array(); throw new LogicException(sprintf('Circular reference detected for form "%s" (%s).', $type->getName(), $types)); } + $checkedTypes[$type->getName()] = true; + if ($parentType->getName() === $type->getName()) { $checkedTypes = array(); throw new LogicException(sprintf('Form "%s" cannot have itself as a parent.', $type->getName())); @@ -141,7 +140,7 @@ private function resolveType(FormTypeInterface $type) $parentType ? $this->getType($parentType) : null ); - unset($checkedTypes[array_search($type->getName(), $checkedTypes)]); + unset($checkedTypes[$type->getName()]); } /** From 04d2661a9507c317b7b034e1f4f61c4d001719a8 Mon Sep 17 00:00:00 2001 From: Pierre du Plessis Date: Sun, 8 Oct 2017 12:21:27 +0200 Subject: [PATCH 05/13] Replace static variable with private property --- src/Symfony/Component/Form/FormRegistry.php | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/src/Symfony/Component/Form/FormRegistry.php b/src/Symfony/Component/Form/FormRegistry.php index 16e7985fa4f5a..d8c795354dd44 100644 --- a/src/Symfony/Component/Form/FormRegistry.php +++ b/src/Symfony/Component/Form/FormRegistry.php @@ -45,6 +45,8 @@ class FormRegistry implements FormRegistryInterface */ private $resolvedTypeFactory; + private $checkedTypes = array(); + /** * @param FormExtensionInterface[] $extensions An array of FormExtensionInterface * @param ResolvedFormTypeFactoryInterface $resolvedTypeFactory The factory for resolved form types @@ -103,25 +105,22 @@ public function getType($name) */ private function resolveType(FormTypeInterface $type) { - static $checkedTypes = array(); - - if (isset($checkedTypes[$type->getName()])) { - $types = implode(' > ', array_merge(array_keys($checkedTypes), array($type->getName()))); - $checkedTypes = array(); + if (isset($this->checkedTypes[$type->getName()])) { + $types = implode(' > ', array_merge(array_keys($this->checkedTypes), array($type->getName()))); throw new LogicException(sprintf('Circular reference detected for form "%s" (%s).', $type->getName(), $types)); } - $checkedTypes[$type->getName()] = true; + $this->checkedTypes[$type->getName()] = true; if ($parentType->getName() === $type->getName()) { - $checkedTypes = array(); + $this->checkedTypes = array(); throw new LogicException(sprintf('Form "%s" cannot have itself as a parent.', $type->getName())); } } if ($parentType === $type->getName()) { - $checkedTypes = array(); + $this->checkedTypes = array(); throw new LogicException(sprintf('Form "%s" cannot have itself as a parent.', $type->getName())); $typeExtensions = array(); $parentType = $type->getParent(); @@ -140,7 +139,7 @@ private function resolveType(FormTypeInterface $type) $parentType ? $this->getType($parentType) : null ); - unset($checkedTypes[$type->getName()]); + unset($this->checkedTypes[$type->getName()]); } /** From a7f2dfc44e5c7072b890c0cc95de75c24dad6d81 Mon Sep 17 00:00:00 2001 From: Pierre du Plessis Date: Mon, 9 Oct 2017 10:43:39 +0200 Subject: [PATCH 06/13] Clear array in exception handler --- src/Symfony/Component/Form/FormRegistry.php | 57 ++++++++++++--------- 1 file changed, 33 insertions(+), 24 deletions(-) diff --git a/src/Symfony/Component/Form/FormRegistry.php b/src/Symfony/Component/Form/FormRegistry.php index d8c795354dd44..fb6e3f211570f 100644 --- a/src/Symfony/Component/Form/FormRegistry.php +++ b/src/Symfony/Component/Form/FormRegistry.php @@ -105,41 +105,50 @@ public function getType($name) */ private function resolveType(FormTypeInterface $type) { - if (isset($this->checkedTypes[$type->getName()])) { - $types = implode(' > ', array_merge(array_keys($this->checkedTypes), array($type->getName()))); - throw new LogicException(sprintf('Circular reference detected for form "%s" (%s).', $type->getName(), $types)); - } + try { + if (isset($this->checkedTypes[$type->getName()])) { + $types = implode(' > ', array_merge(array_keys($this->checkedTypes), [$type->getName()])); + throw new LogicException(sprintf('Circular reference detected for form "%s" (%s).', $type->getName(), $types)); + } - $this->checkedTypes[$type->getName()] = true; + $this->checkedTypes[$type->getName()] = true; - if ($parentType->getName() === $type->getName()) { - $this->checkedTypes = array(); - throw new LogicException(sprintf('Form "%s" cannot have itself as a parent.', $type->getName())); - } + $parentType = $type->getParent(); + if ($parentType instanceof FormTypeInterface) { + if ($parentType->getName() === $type->getName()) { + throw new LogicException(sprintf('Form "%s" cannot have itself as a parent.', $type->getName())); + } - } + $this->resolveAndAddType($parentType); + $parentType = $parentType->getName(); + } - if ($parentType === $type->getName()) { - $this->checkedTypes = array(); - throw new LogicException(sprintf('Form "%s" cannot have itself as a parent.', $type->getName())); - $typeExtensions = array(); + if ($parentType === $type->getName()) { + throw new LogicException(sprintf('Form "%s" cannot have itself as a parent.', $type->getName())); + } + $typeExtensions = []; $parentType = $type->getParent(); $fqcn = get_class($type); - foreach ($this->extensions as $extension) { - $typeExtensions = array_merge( + foreach ($this->extensions as $extension) { + $typeExtensions = array_merge( + $typeExtensions, + $extension->getTypeExtensions($type->getName()) + ); + } + + $this->types[$type->getName()] = $this->resolvedTypeFactory->createResolvedType( + $type, $typeExtensions, - $extension->getTypeExtensions($fqcn) + $parentType ? $this->getType($parentType) : null ); - } - return $this->resolvedTypeFactory->createResolvedType( - $type, - $typeExtensions, - $parentType ? $this->getType($parentType) : null - ); + unset($this->checkedTypes[$type->getName()]); + } catch (\Exception $e) { + $this->checkedTypes = array(); - unset($this->checkedTypes[$type->getName()]); + throw $e; + } } /** From 104de3111597aeb2a85d0b9c8579c17c77c21cac Mon Sep 17 00:00:00 2001 From: Pierre du Plessis Date: Mon, 9 Oct 2017 10:54:49 +0200 Subject: [PATCH 07/13] Fix CS --- src/Symfony/Component/Form/FormRegistry.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Symfony/Component/Form/FormRegistry.php b/src/Symfony/Component/Form/FormRegistry.php index fb6e3f211570f..89865afd8111a 100644 --- a/src/Symfony/Component/Form/FormRegistry.php +++ b/src/Symfony/Component/Form/FormRegistry.php @@ -107,7 +107,7 @@ private function resolveType(FormTypeInterface $type) { try { if (isset($this->checkedTypes[$type->getName()])) { - $types = implode(' > ', array_merge(array_keys($this->checkedTypes), [$type->getName()])); + $types = implode(' > ', array_merge(array_keys($this->checkedTypes), array($type->getName()))); throw new LogicException(sprintf('Circular reference detected for form "%s" (%s).', $type->getName(), $types)); } @@ -126,7 +126,7 @@ private function resolveType(FormTypeInterface $type) if ($parentType === $type->getName()) { throw new LogicException(sprintf('Form "%s" cannot have itself as a parent.', $type->getName())); } - $typeExtensions = []; + $typeExtensions = array(); $parentType = $type->getParent(); $fqcn = get_class($type); From d41c159b6f4fd9d03708dd1f793fc87ba85d6187 Mon Sep 17 00:00:00 2001 From: Pierre du Plessis Date: Tue, 10 Oct 2017 10:26:44 +0200 Subject: [PATCH 08/13] Update to use FQCN for form types --- src/Symfony/Component/Form/FormRegistry.php | 49 +++++++--------- ...sString.php => FormWithSameParentType.php} | 9 +-- ...StringBar.php => RecursiveFormTypeBar.php} | 9 +-- ...StringBaz.php => RecursiveFormTypeBaz.php} | 9 +-- ...StringFoo.php => RecursiveFormTypeFoo.php} | 9 +-- .../Fixtures/RecursiveFormTypeObjectBar.php | 27 --------- .../Fixtures/RecursiveFormTypeObjectBaz.php | 27 --------- .../Fixtures/RecursiveFormTypeObjectFoo.php | 27 --------- .../Component/Form/Tests/FormRegistryTest.php | 56 +++++-------------- 9 files changed, 41 insertions(+), 181 deletions(-) rename src/Symfony/Component/Form/Tests/Fixtures/{FormWithSameParentTypeAsString.php => FormWithSameParentType.php} (70%) rename src/Symfony/Component/Form/Tests/Fixtures/{RecursiveFormTypeStringBar.php => RecursiveFormTypeBar.php} (69%) rename src/Symfony/Component/Form/Tests/Fixtures/{RecursiveFormTypeStringBaz.php => RecursiveFormTypeBaz.php} (69%) rename src/Symfony/Component/Form/Tests/Fixtures/{RecursiveFormTypeStringFoo.php => RecursiveFormTypeFoo.php} (69%) delete mode 100644 src/Symfony/Component/Form/Tests/Fixtures/RecursiveFormTypeObjectBar.php delete mode 100644 src/Symfony/Component/Form/Tests/Fixtures/RecursiveFormTypeObjectBaz.php delete mode 100644 src/Symfony/Component/Form/Tests/Fixtures/RecursiveFormTypeObjectFoo.php diff --git a/src/Symfony/Component/Form/FormRegistry.php b/src/Symfony/Component/Form/FormRegistry.php index 89865afd8111a..1b2f685102240 100644 --- a/src/Symfony/Component/Form/FormRegistry.php +++ b/src/Symfony/Component/Form/FormRegistry.php @@ -106,48 +106,39 @@ public function getType($name) private function resolveType(FormTypeInterface $type) { try { - if (isset($this->checkedTypes[$type->getName()])) { - $types = implode(' > ', array_merge(array_keys($this->checkedTypes), array($type->getName()))); - throw new LogicException(sprintf('Circular reference detected for form "%s" (%s).', $type->getName(), $types)); - } - - $this->checkedTypes[$type->getName()] = true; - + $typeExtensions = array(); $parentType = $type->getParent(); - if ($parentType instanceof FormTypeInterface) { - if ($parentType->getName() === $type->getName()) { - throw new LogicException(sprintf('Form "%s" cannot have itself as a parent.', $type->getName())); - } + $fqcn = get_class($type); - $this->resolveAndAddType($parentType); - $parentType = $parentType->getName(); + if (isset($this->checkedTypes[$fqcn])) { + $types = implode(' > ', array_merge(array_keys($this->checkedTypes), array($fqcn))); + throw new LogicException(sprintf('Circular reference detected for form "%s" (%s).', $fqcn, $types)); } - if ($parentType === $type->getName()) { - throw new LogicException(sprintf('Form "%s" cannot have itself as a parent.', $type->getName())); + $this->checkedTypes[$fqcn] = true; + + if ($parentType === $fqcn) { + throw new LogicException(sprintf('Form "%s" cannot have itself as a parent.', $fqcn)); } - $typeExtensions = array(); - $parentType = $type->getParent(); - $fqcn = get_class($type); foreach ($this->extensions as $extension) { $typeExtensions = array_merge( $typeExtensions, - $extension->getTypeExtensions($type->getName()) + $extension->getTypeExtensions($fqcn) ); } - $this->types[$type->getName()] = $this->resolvedTypeFactory->createResolvedType( - $type, - $typeExtensions, - $parentType ? $this->getType($parentType) : null - ); - - unset($this->checkedTypes[$type->getName()]); - } catch (\Exception $e) { + try { + return $this->resolvedTypeFactory->createResolvedType( + $type, + $typeExtensions, + $parentType ? $this->getType($parentType) : null + ); + } finally { + unset($this->checkedTypes[$fqcn]); + } + } finally { $this->checkedTypes = array(); - - throw $e; } } diff --git a/src/Symfony/Component/Form/Tests/Fixtures/FormWithSameParentTypeAsString.php b/src/Symfony/Component/Form/Tests/Fixtures/FormWithSameParentType.php similarity index 70% rename from src/Symfony/Component/Form/Tests/Fixtures/FormWithSameParentTypeAsString.php rename to src/Symfony/Component/Form/Tests/Fixtures/FormWithSameParentType.php index 9196e68bbb8e8..f1d65314af0bf 100644 --- a/src/Symfony/Component/Form/Tests/Fixtures/FormWithSameParentTypeAsString.php +++ b/src/Symfony/Component/Form/Tests/Fixtures/FormWithSameParentType.php @@ -13,15 +13,10 @@ use Symfony\Component\Form\AbstractType; -class FormWithSameParentTypeAsString extends AbstractType +class FormWithSameParentType extends AbstractType { - public function getName() - { - return 'foo_type'; - } - public function getParent() { - return 'foo_type'; + return FormWithSameParentType::class; } } diff --git a/src/Symfony/Component/Form/Tests/Fixtures/RecursiveFormTypeStringBar.php b/src/Symfony/Component/Form/Tests/Fixtures/RecursiveFormTypeBar.php similarity index 69% rename from src/Symfony/Component/Form/Tests/Fixtures/RecursiveFormTypeStringBar.php rename to src/Symfony/Component/Form/Tests/Fixtures/RecursiveFormTypeBar.php index a2723848971b7..a7b0d4df35b00 100644 --- a/src/Symfony/Component/Form/Tests/Fixtures/RecursiveFormTypeStringBar.php +++ b/src/Symfony/Component/Form/Tests/Fixtures/RecursiveFormTypeBar.php @@ -13,15 +13,10 @@ use Symfony\Component\Form\AbstractType; -class RecursiveFormTypeStringBar extends AbstractType +class RecursiveFormTypeBar extends AbstractType { public function getParent() { - return 'baz_string_type'; - } - - public function getName() - { - return 'bar_string_type'; + return RecursiveFormTypeBaz::class; } } diff --git a/src/Symfony/Component/Form/Tests/Fixtures/RecursiveFormTypeStringBaz.php b/src/Symfony/Component/Form/Tests/Fixtures/RecursiveFormTypeBaz.php similarity index 69% rename from src/Symfony/Component/Form/Tests/Fixtures/RecursiveFormTypeStringBaz.php rename to src/Symfony/Component/Form/Tests/Fixtures/RecursiveFormTypeBaz.php index f56606f95c343..63f62e757f93e 100644 --- a/src/Symfony/Component/Form/Tests/Fixtures/RecursiveFormTypeStringBaz.php +++ b/src/Symfony/Component/Form/Tests/Fixtures/RecursiveFormTypeBaz.php @@ -13,15 +13,10 @@ use Symfony\Component\Form\AbstractType; -class RecursiveFormTypeStringBaz extends AbstractType +class RecursiveFormTypeBaz extends AbstractType { public function getParent() { - return 'foo_string_type'; - } - - public function getName() - { - return 'baz_string_type'; + return RecursiveFormTypeFoo::class; } } diff --git a/src/Symfony/Component/Form/Tests/Fixtures/RecursiveFormTypeStringFoo.php b/src/Symfony/Component/Form/Tests/Fixtures/RecursiveFormTypeFoo.php similarity index 69% rename from src/Symfony/Component/Form/Tests/Fixtures/RecursiveFormTypeStringFoo.php rename to src/Symfony/Component/Form/Tests/Fixtures/RecursiveFormTypeFoo.php index 826a974d23a94..a41f63ee0b9cb 100644 --- a/src/Symfony/Component/Form/Tests/Fixtures/RecursiveFormTypeStringFoo.php +++ b/src/Symfony/Component/Form/Tests/Fixtures/RecursiveFormTypeFoo.php @@ -13,15 +13,10 @@ use Symfony\Component\Form\AbstractType; -class RecursiveFormTypeStringFoo extends AbstractType +class RecursiveFormTypeFoo extends AbstractType { public function getParent() { - return 'bar_string_type'; - } - - public function getName() - { - return 'foo_string_type'; + return RecursiveFormTypeBar::class; } } diff --git a/src/Symfony/Component/Form/Tests/Fixtures/RecursiveFormTypeObjectBar.php b/src/Symfony/Component/Form/Tests/Fixtures/RecursiveFormTypeObjectBar.php deleted file mode 100644 index aa2f2ae1f38a2..0000000000000 --- a/src/Symfony/Component/Form/Tests/Fixtures/RecursiveFormTypeObjectBar.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Form\Tests\Fixtures; - -use Symfony\Component\Form\AbstractType; - -class RecursiveFormTypeObjectBar extends AbstractType -{ - public function getParent() - { - return new RecursiveFormTypeObjectBaz(); - } - - public function getName() - { - return 'bar_object_type'; - } -} diff --git a/src/Symfony/Component/Form/Tests/Fixtures/RecursiveFormTypeObjectBaz.php b/src/Symfony/Component/Form/Tests/Fixtures/RecursiveFormTypeObjectBaz.php deleted file mode 100644 index 47c0ad2a6ffa6..0000000000000 --- a/src/Symfony/Component/Form/Tests/Fixtures/RecursiveFormTypeObjectBaz.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Form\Tests\Fixtures; - -use Symfony\Component\Form\AbstractType; - -class RecursiveFormTypeObjectBaz extends AbstractType -{ - public function getParent() - { - return new RecursiveFormTypeObjectFoo(); - } - - public function getName() - { - return 'baz_object_type'; - } -} diff --git a/src/Symfony/Component/Form/Tests/Fixtures/RecursiveFormTypeObjectFoo.php b/src/Symfony/Component/Form/Tests/Fixtures/RecursiveFormTypeObjectFoo.php deleted file mode 100644 index 7b590463941ce..0000000000000 --- a/src/Symfony/Component/Form/Tests/Fixtures/RecursiveFormTypeObjectFoo.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Form\Tests\Fixtures; - -use Symfony\Component\Form\AbstractType; - -class RecursiveFormTypeObjectFoo extends AbstractType -{ - public function getParent() - { - return new RecursiveFormTypeObjectBar(); - } - - public function getName() - { - return 'foo_object_type'; - } -} diff --git a/src/Symfony/Component/Form/Tests/FormRegistryTest.php b/src/Symfony/Component/Form/Tests/FormRegistryTest.php index 506858e7b6973..4bf9a40fc5c72 100644 --- a/src/Symfony/Component/Form/Tests/FormRegistryTest.php +++ b/src/Symfony/Component/Form/Tests/FormRegistryTest.php @@ -17,13 +17,13 @@ use Symfony\Component\Form\ResolvedFormType; use Symfony\Component\Form\ResolvedFormTypeFactoryInterface; use Symfony\Component\Form\Tests\Fixtures\FormWithSameParentTypeAsObject; -use Symfony\Component\Form\Tests\Fixtures\FormWithSameParentTypeAsString; +use Symfony\Component\Form\Tests\Fixtures\FormWithSameParentType; use Symfony\Component\Form\Tests\Fixtures\RecursiveFormTypeObjectBar; use Symfony\Component\Form\Tests\Fixtures\RecursiveFormTypeObjectBaz; use Symfony\Component\Form\Tests\Fixtures\RecursiveFormTypeObjectFoo; -use Symfony\Component\Form\Tests\Fixtures\RecursiveFormTypeStringBar; -use Symfony\Component\Form\Tests\Fixtures\RecursiveFormTypeStringBaz; -use Symfony\Component\Form\Tests\Fixtures\RecursiveFormTypeStringFoo; +use Symfony\Component\Form\Tests\Fixtures\RecursiveFormTypeBar; +use Symfony\Component\Form\Tests\Fixtures\RecursiveFormTypeBaz; +use Symfony\Component\Form\Tests\Fixtures\RecursiveFormTypeFoo; use Symfony\Component\Form\Tests\Fixtures\FooSubType; use Symfony\Component\Form\Tests\Fixtures\FooType; use Symfony\Component\Form\Tests\Fixtures\FooTypeBarExtension; @@ -166,62 +166,32 @@ public function testGetTypeConnectsParent() /** * @expectedException \Symfony\Component\Form\Exception\LogicException - * @expectedExceptionMessage Form "foo_type" cannot have itself as a parent. + * @expectedExceptionMessage Form "Symfony\Component\Form\Tests\Fixtures\FormWithSameParentType" cannot have itself as a parent. */ public function testFormCannotHaveItselfAsAParent() { - $type = new FormWithSameParentTypeAsString(); + $type = new FormWithSameParentType(); $this->extension2->addType($type); - $this->registry->getType('foo_type'); + $this->registry->getType(FormWithSameParentType::class); } /** * @expectedException \Symfony\Component\Form\Exception\LogicException - * @expectedExceptionMessage Form "foo_type" cannot have itself as a parent. + * @expectedExceptionMessage Circular reference detected for form "Symfony\Component\Form\Tests\Fixtures\RecursiveFormTypeFoo" (Symfony\Component\Form\Tests\Fixtures\RecursiveFormTypeFoo > Symfony\Component\Form\Tests\Fixtures\RecursiveFormTypeBar > Symfony\Component\Form\Tests\Fixtures\RecursiveFormTypeBaz > Symfony\Component\Form\Tests\Fixtures\RecursiveFormTypeFoo). */ - public function testFormCannotHaveItselfAsAParentIfGetParentReturnsInstance() + public function testRecursiveFormDependencies() { - $type = new FormWithSameParentTypeAsObject(); - - $this->extension2->addType($type); - - $this->registry->getType('foo_type'); - } - - /** - * @expectedException \Symfony\Component\Form\Exception\LogicException - * @expectedExceptionMessage Circular reference detected for form "foo_string_type" (foo_string_type > bar_string_type > baz_string_type > foo_string_type). - */ - public function testRecursiveFormDependenciesWithStringParent() - { - $foo = new RecursiveFormTypeStringFoo(); - $bar = new RecursiveFormTypeStringBar(); - $baz = new RecursiveFormTypeStringBaz(); - - $this->extension2->addType($foo); - $this->extension2->addType($bar); - $this->extension2->addType($baz); - - $this->registry->getType('foo_string_type'); - } - - /** - * @expectedException \Symfony\Component\Form\Exception\LogicException - * @expectedExceptionMessage Circular reference detected for form "foo_object_type" (foo_object_type > bar_object_type > baz_object_type > foo_object_type). - */ - public function testRecursiveFormDependenciesWithObjectParent() - { - $foo = new RecursiveFormTypeObjectFoo(); - $bar = new RecursiveFormTypeObjectBar(); - $baz = new RecursiveFormTypeObjectBaz(); + $foo = new RecursiveFormTypeFoo(); + $bar = new RecursiveFormTypeBar(); + $baz = new RecursiveFormTypeBaz(); $this->extension2->addType($foo); $this->extension2->addType($bar); $this->extension2->addType($baz); - $this->registry->getType('foo_object_type'); + $this->registry->getType(RecursiveFormTypeFoo::class); } /** From 73cc6d647049ca20681531060e10b06cb2f5e10e Mon Sep 17 00:00:00 2001 From: Pierre du Plessis Date: Tue, 10 Oct 2017 10:27:20 +0200 Subject: [PATCH 09/13] Removed unused classes --- src/Symfony/Component/Form/Tests/FormRegistryTest.php | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/Symfony/Component/Form/Tests/FormRegistryTest.php b/src/Symfony/Component/Form/Tests/FormRegistryTest.php index 4bf9a40fc5c72..65ff5bd17d8d5 100644 --- a/src/Symfony/Component/Form/Tests/FormRegistryTest.php +++ b/src/Symfony/Component/Form/Tests/FormRegistryTest.php @@ -16,11 +16,7 @@ use Symfony\Component\Form\FormTypeGuesserChain; use Symfony\Component\Form\ResolvedFormType; use Symfony\Component\Form\ResolvedFormTypeFactoryInterface; -use Symfony\Component\Form\Tests\Fixtures\FormWithSameParentTypeAsObject; use Symfony\Component\Form\Tests\Fixtures\FormWithSameParentType; -use Symfony\Component\Form\Tests\Fixtures\RecursiveFormTypeObjectBar; -use Symfony\Component\Form\Tests\Fixtures\RecursiveFormTypeObjectBaz; -use Symfony\Component\Form\Tests\Fixtures\RecursiveFormTypeObjectFoo; use Symfony\Component\Form\Tests\Fixtures\RecursiveFormTypeBar; use Symfony\Component\Form\Tests\Fixtures\RecursiveFormTypeBaz; use Symfony\Component\Form\Tests\Fixtures\RecursiveFormTypeFoo; From 746f1d5670a4c0912fca02d5ffd2b89e753ba260 Mon Sep 17 00:00:00 2001 From: Pierre du Plessis Date: Tue, 10 Oct 2017 10:29:09 +0200 Subject: [PATCH 10/13] Fix CS --- .../Component/Form/Tests/Fixtures/FormWithSameParentType.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Symfony/Component/Form/Tests/Fixtures/FormWithSameParentType.php b/src/Symfony/Component/Form/Tests/Fixtures/FormWithSameParentType.php index f1d65314af0bf..098f9a2a2b708 100644 --- a/src/Symfony/Component/Form/Tests/Fixtures/FormWithSameParentType.php +++ b/src/Symfony/Component/Form/Tests/Fixtures/FormWithSameParentType.php @@ -17,6 +17,6 @@ class FormWithSameParentType extends AbstractType { public function getParent() { - return FormWithSameParentType::class; + return self::class; } } From c9ed200214bce980f5b91f91548e2da41c1e0581 Mon Sep 17 00:00:00 2001 From: Pierre du Plessis Date: Tue, 10 Oct 2017 10:30:14 +0200 Subject: [PATCH 11/13] Removed unused test class --- .../FormWithSameParentTypeAsObject.php | 27 ------------------- 1 file changed, 27 deletions(-) delete mode 100644 src/Symfony/Component/Form/Tests/Fixtures/FormWithSameParentTypeAsObject.php diff --git a/src/Symfony/Component/Form/Tests/Fixtures/FormWithSameParentTypeAsObject.php b/src/Symfony/Component/Form/Tests/Fixtures/FormWithSameParentTypeAsObject.php deleted file mode 100644 index 3fbf9c876ec63..0000000000000 --- a/src/Symfony/Component/Form/Tests/Fixtures/FormWithSameParentTypeAsObject.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Form\Tests\Fixtures; - -use Symfony\Component\Form\AbstractType; - -class FormWithSameParentTypeAsObject extends AbstractType -{ - public function getName() - { - return 'foo_type'; - } - - public function getParent() - { - return new self(); - } -} From d2b027c939f37f09cfe288c795fb36f3089bcbd8 Mon Sep 17 00:00:00 2001 From: Pierre du Plessis Date: Tue, 10 Oct 2017 10:56:24 +0200 Subject: [PATCH 12/13] Remove additional try/finally --- src/Symfony/Component/Form/FormRegistry.php | 34 +++++++++------------ 1 file changed, 15 insertions(+), 19 deletions(-) diff --git a/src/Symfony/Component/Form/FormRegistry.php b/src/Symfony/Component/Form/FormRegistry.php index 1b2f685102240..4db1d1362e577 100644 --- a/src/Symfony/Component/Form/FormRegistry.php +++ b/src/Symfony/Component/Form/FormRegistry.php @@ -105,18 +105,18 @@ public function getType($name) */ private function resolveType(FormTypeInterface $type) { - try { - $typeExtensions = array(); - $parentType = $type->getParent(); - $fqcn = get_class($type); + $typeExtensions = array(); + $parentType = $type->getParent(); + $fqcn = get_class($type); - if (isset($this->checkedTypes[$fqcn])) { - $types = implode(' > ', array_merge(array_keys($this->checkedTypes), array($fqcn))); - throw new LogicException(sprintf('Circular reference detected for form "%s" (%s).', $fqcn, $types)); - } + if (isset($this->checkedTypes[$fqcn])) { + $types = implode(' > ', array_merge(array_keys($this->checkedTypes), array($fqcn))); + throw new LogicException(sprintf('Circular reference detected for form "%s" (%s).', $fqcn, $types)); + } - $this->checkedTypes[$fqcn] = true; + $this->checkedTypes[$fqcn] = true; + try { if ($parentType === $fqcn) { throw new LogicException(sprintf('Form "%s" cannot have itself as a parent.', $fqcn)); } @@ -128,17 +128,13 @@ private function resolveType(FormTypeInterface $type) ); } - try { - return $this->resolvedTypeFactory->createResolvedType( - $type, - $typeExtensions, - $parentType ? $this->getType($parentType) : null - ); - } finally { - unset($this->checkedTypes[$fqcn]); - } + return $this->resolvedTypeFactory->createResolvedType( + $type, + $typeExtensions, + $parentType ? $this->getType($parentType) : null + ); } finally { - $this->checkedTypes = array(); + unset($this->checkedTypes[$fqcn]); } } From c8aac13715b94a1ca8a2127acb9e01194aaca917 Mon Sep 17 00:00:00 2001 From: Pierre du Plessis Date: Tue, 10 Oct 2017 11:17:12 +0200 Subject: [PATCH 13/13] Remove explicit parent form type check --- src/Symfony/Component/Form/FormRegistry.php | 4 ---- src/Symfony/Component/Form/Tests/FormRegistryTest.php | 2 +- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/src/Symfony/Component/Form/FormRegistry.php b/src/Symfony/Component/Form/FormRegistry.php index 4db1d1362e577..c81d45957b008 100644 --- a/src/Symfony/Component/Form/FormRegistry.php +++ b/src/Symfony/Component/Form/FormRegistry.php @@ -117,10 +117,6 @@ private function resolveType(FormTypeInterface $type) $this->checkedTypes[$fqcn] = true; try { - if ($parentType === $fqcn) { - throw new LogicException(sprintf('Form "%s" cannot have itself as a parent.', $fqcn)); - } - foreach ($this->extensions as $extension) { $typeExtensions = array_merge( $typeExtensions, diff --git a/src/Symfony/Component/Form/Tests/FormRegistryTest.php b/src/Symfony/Component/Form/Tests/FormRegistryTest.php index 65ff5bd17d8d5..4fbcb4339a1a1 100644 --- a/src/Symfony/Component/Form/Tests/FormRegistryTest.php +++ b/src/Symfony/Component/Form/Tests/FormRegistryTest.php @@ -162,7 +162,7 @@ public function testGetTypeConnectsParent() /** * @expectedException \Symfony\Component\Form\Exception\LogicException - * @expectedExceptionMessage Form "Symfony\Component\Form\Tests\Fixtures\FormWithSameParentType" cannot have itself as a parent. + * @expectedExceptionMessage Circular reference detected for form "Symfony\Component\Form\Tests\Fixtures\FormWithSameParentType" (Symfony\Component\Form\Tests\Fixtures\FormWithSameParentType > Symfony\Component\Form\Tests\Fixtures\FormWithSameParentType). */ public function testFormCannotHaveItselfAsAParent() {