diff --git a/src/Symfony/Component/Form/FormFactory.php b/src/Symfony/Component/Form/FormFactory.php index e00d8ab4fad29..5e92baa64f925 100644 --- a/src/Symfony/Component/Form/FormFactory.php +++ b/src/Symfony/Component/Form/FormFactory.php @@ -74,15 +74,29 @@ public function createBuilder($type = 'Symfony\Component\Form\Extension\Core\Typ $typeName = $type->getName(); } } elseif ($type instanceof FormTypeInterface) { - // BC - $typeName = $type->getName(); + if (method_exists($type, 'getBlockPrefix')) { + // As of Symfony 3.0, the block prefix of the type is used as + // default name + $name = $type->getBlockPrefix(); + } else { + // BC + $typeName = $type->getName(); + } } elseif (is_string($type)) { - // BC - $typeName = $type; + $resolvedType = $this->registry->getType($type); + if (method_exists($resolvedType, 'getBlockPrefix')) { + // As of Symfony 3.0, the block prefix of the type is used as + // default name + $name = $resolvedType->getBlockPrefix(); + } else { + // BC + $typeName = $type; + } } else { throw new UnexpectedTypeException($type, 'string, Symfony\Component\Form\ResolvedFormTypeInterface or Symfony\Component\Form\FormTypeInterface'); } + // BC when there is no block prefix if (null === $name) { if (false === strpos($typeName, '\\')) { // No FQCN - leave unchanged for BC diff --git a/src/Symfony/Component/Form/Tests/FormFactoryTest.php b/src/Symfony/Component/Form/Tests/FormFactoryTest.php index 1f65c3c0c1499..0ec0b40590e78 100644 --- a/src/Symfony/Component/Form/Tests/FormFactoryTest.php +++ b/src/Symfony/Component/Form/Tests/FormFactoryTest.php @@ -302,13 +302,52 @@ public function testCreateThrowsUnderstandableException() $this->factory->create(new \stdClass()); } + public function testCreateUsesBlockPrefixIfTypeGivenAsString() + { + $options = array('a' => '1', 'b' => '2'); + $resolvedOptions = array('a' => '2', 'b' => '3'); + + // the interface does not have the method, so use the real class + $resolvedType = $this->getMockBuilder('Symfony\Component\Form\ResolvedFormType') + ->disableOriginalConstructor() + ->getMock(); + + $resolvedType->expects($this->any()) + ->method('getBlockPrefix') + ->willReturn('TYPE_PREFIX'); + + $this->registry->expects($this->any()) + ->method('getType') + ->with('TYPE') + ->will($this->returnValue($resolvedType)); + + $resolvedType->expects($this->once()) + ->method('createBuilder') + ->with($this->factory, 'TYPE_PREFIX', $options) + ->will($this->returnValue($this->builder)); + + $this->builder->expects($this->any()) + ->method('getOptions') + ->will($this->returnValue($resolvedOptions)); + + $resolvedType->expects($this->once()) + ->method('buildForm') + ->with($this->builder, $resolvedOptions); + + $this->builder->expects($this->once()) + ->method('getForm') + ->will($this->returnValue('FORM')); + + $this->assertSame('FORM', $this->factory->create('TYPE', null, $options)); + } + public function testCreateUsesTypeNameIfTypeGivenAsString() { $options = array('a' => '1', 'b' => '2'); $resolvedOptions = array('a' => '2', 'b' => '3'); $resolvedType = $this->getMockResolvedType(); - $this->registry->expects($this->once()) + $this->registry->expects($this->any()) ->method('getType') ->with('TYPE') ->will($this->returnValue($resolvedType)); @@ -339,7 +378,7 @@ public function testCreateStripsNamespaceOffTypeName() $resolvedOptions = array('a' => '2', 'b' => '3'); $resolvedType = $this->getMockResolvedType(); - $this->registry->expects($this->once()) + $this->registry->expects($this->any()) ->method('getType') ->with('Vendor\Name\Space\UserForm') ->will($this->returnValue($resolvedType)); @@ -370,7 +409,7 @@ public function testLegacyCreateStripsNamespaceOffTypeNameAccessByFQCN() $resolvedOptions = array('a' => '2', 'b' => '3'); $resolvedType = $this->getMockResolvedType(); - $this->registry->expects($this->once()) + $this->registry->expects($this->any()) ->method('getType') ->with('userform') ->will($this->returnValue($resolvedType)); @@ -401,7 +440,7 @@ public function testCreateStripsTypeSuffixOffTypeName() $resolvedOptions = array('a' => '2', 'b' => '3'); $resolvedType = $this->getMockResolvedType(); - $this->registry->expects($this->once()) + $this->registry->expects($this->any()) ->method('getType') ->with('Vendor\Name\Space\UserType') ->will($this->returnValue($resolvedType)); @@ -432,7 +471,7 @@ public function testCreateDoesNotStripTypeSuffixIfResultEmpty() $resolvedOptions = array('a' => '2', 'b' => '3'); $resolvedType = $this->getMockResolvedType(); - $this->registry->expects($this->once()) + $this->registry->expects($this->any()) ->method('getType') ->with('Vendor\Name\Space\Type') ->will($this->returnValue($resolvedType)); @@ -463,7 +502,7 @@ public function testCreateConvertsTypeToUnderscoreSyntax() $resolvedOptions = array('a' => '2', 'b' => '3'); $resolvedType = $this->getMockResolvedType(); - $this->registry->expects($this->once()) + $this->registry->expects($this->any()) ->method('getType') ->with('Vendor\Name\Space\MyProfileHTMLType') ->will($this->returnValue($resolvedType));
Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.
Alternative Proxies: