Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit cf8b4e2

Browse files
committed
bug #11645 [Form] Fixed ValidatorExtension to work with the 2.5 Validation API (webmozart)
This PR was merged into the 2.5 branch. Discussion ---------- [Form] Fixed ValidatorExtension to work with the 2.5 Validation API | Q | A | ------------- | --- | Bug fix? | yes | New feature? | no | BC breaks? | no | Deprecations? | no | Tests pass? | yes | Fixed tickets | #11606 | License | MIT | Doc PR | - The ValidatorExtension::loadTypeGuesser() method used to fail because the method `getMetadataFactory()` does not exist anymore on the new `ValidatorInterface`. This was fixed easily, because `ValidatorInterface` now extends `ClassMetadataFactory`. Commits ------- ff74f4e [Form] Fixed ValidatorExtension to work with the 2.5 Validation API
2 parents 0801a3a + ff74f4e commit cf8b4e2

File tree

2 files changed

+60
-63
lines changed

2 files changed

+60
-63
lines changed

src/Symfony/Component/Form/Extension/Validator/ValidatorExtension.php

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
namespace Symfony\Component\Form\Extension\Validator;
1313

14+
use Symfony\Component\Form\Exception\UnexpectedTypeException;
1415
use Symfony\Component\Form\Extension\Validator\Constraints\Form;
1516
use Symfony\Component\Form\AbstractExtension;
1617
use Symfony\Component\Validator\Constraints\Valid;
@@ -29,37 +30,42 @@ class ValidatorExtension extends AbstractExtension
2930

3031
/**
3132
* @param ValidatorInterface|LegacyValidatorInterface $validator
33+
*
34+
* @throws UnexpectedTypeException If $validator is invalid
3235
*/
3336
public function __construct($validator)
3437
{
35-
// since validator apiVersion 2.5
38+
// 2.5 API
3639
if ($validator instanceof ValidatorInterface) {
37-
$this->validator = $validator;
38-
39-
/** @var $metadata ClassMetadata */
40-
$metadata = $this->validator->getMetadataFor('Symfony\Component\Form\Form');
41-
// until validator apiVersion 2.4
40+
$metadata = $validator->getMetadataFor('Symfony\Component\Form\Form');
41+
// 2.4 API
4242
} elseif ($validator instanceof LegacyValidatorInterface) {
43-
$this->validator = $validator;
44-
45-
/** @var $metadata ClassMetadata */
46-
$metadata = $this->validator->getMetadataFactory()->getMetadataFor('Symfony\Component\Form\Form');
43+
$metadata = $validator->getMetadataFactory()->getMetadataFor('Symfony\Component\Form\Form');
4744
} else {
48-
throw new \InvalidArgumentException('Validator must be instance of Symfony\Component\Validator\Validator\ValidatorInterface or Symfony\Component\Validator\ValidatorInterface');
45+
throw new UnexpectedTypeException($validator, 'Symfony\Component\Validator\Validator\ValidatorInterface or Symfony\Component\Validator\ValidatorInterface');
4946
}
5047

5148
// Register the form constraints in the validator programmatically.
5249
// This functionality is required when using the Form component without
5350
// the DIC, where the XML file is loaded automatically. Thus the following
5451
// code must be kept synchronized with validation.xml
5552

53+
/** @var $metadata ClassMetadata */
5654
$metadata->addConstraint(new Form());
5755
$metadata->addPropertyConstraint('children', new Valid());
56+
57+
$this->validator = $validator;
5858
}
5959

6060
public function loadTypeGuesser()
6161
{
62-
return new ValidatorTypeGuesser($this->validator->getMetadataFactory());
62+
// 2.4 API
63+
if ($this->validator instanceof LegacyValidatorInterface) {
64+
return new ValidatorTypeGuesser($this->validator->getMetadataFactory());
65+
}
66+
67+
// 2.5 API - ValidatorInterface extends MetadataFactoryInterface
68+
return new ValidatorTypeGuesser($this->validator);
6369
}
6470

6571
protected function loadTypeExtensions()

src/Symfony/Component/Form/Tests/Extension/Validator/ValidatorExtensionTest.php

Lines changed: 42 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -15,79 +15,70 @@
1515

1616
class ValidatorExtensionTest extends \PHPUnit_Framework_TestCase
1717
{
18-
public function testValidatorInterfaceSinceSymfony25()
18+
public function test2Dot5ValidationApi()
1919
{
20-
$classMetaData = $this->createClassMetaDataMock();
21-
22-
// Mock of ValidatorInterface since apiVersion 2.5
2320
$validator = $this->getMock('Symfony\Component\Validator\Validator\ValidatorInterface');
21+
$metadata = $this->getMockBuilder('Symfony\Component\Validator\Mapping\ClassMetadata')
22+
->disableOriginalConstructor()
23+
->getMock();
2424

25-
$validator
26-
->expects($this->once())
25+
$validator->expects($this->once())
2726
->method('getMetadataFor')
2827
->with($this->identicalTo('Symfony\Component\Form\Form'))
29-
->will($this->returnValue($classMetaData))
30-
;
28+
->will($this->returnValue($metadata));
29+
30+
// Verify that the constraints are added
31+
$metadata->expects($this->once())
32+
->method('addConstraint')
33+
->with($this->isInstanceOf('Symfony\Component\Form\Extension\Validator\Constraints\Form'));
34+
35+
$metadata->expects($this->once())
36+
->method('addPropertyConstraint')
37+
->with('children', $this->isInstanceOf('Symfony\Component\Validator\Constraints\Valid'));
3138

32-
$validatorExtension = new ValidatorExtension($validator);
33-
$this->assertAttributeSame($validator, 'validator', $validatorExtension);
39+
$extension = new ValidatorExtension($validator);
40+
$guesser = $extension->loadTypeGuesser();
41+
42+
$this->assertInstanceOf('Symfony\Component\Form\Extension\Validator\ValidatorTypeGuesser', $guesser);
3443
}
3544

36-
public function testValidatorInterfaceUntilSymfony24()
45+
public function test2Dot4ValidationApi()
3746
{
38-
$classMetaData = $this->createClassMetaDataMock();
47+
$factory = $this->getMock('Symfony\Component\Validator\MetadataFactoryInterface');
48+
$validator = $this->getMock('Symfony\Component\Validator\ValidatorInterface');
49+
$metadata = $this->getMockBuilder('Symfony\Component\Validator\Mapping\ClassMetadata')
50+
->disableOriginalConstructor()
51+
->getMock();
3952

40-
$metaDataFactory = $this->getMock('Symfony\Component\Validator\MetadataFactoryInterface');
53+
$validator->expects($this->any())
54+
->method('getMetadataFactory')
55+
->will($this->returnValue($factory));
4156

42-
$metaDataFactory
43-
->expects($this->once())
57+
$factory->expects($this->once())
4458
->method('getMetadataFor')
4559
->with($this->identicalTo('Symfony\Component\Form\Form'))
46-
->will($this->returnValue($classMetaData))
47-
;
60+
->will($this->returnValue($metadata));
4861

49-
// Mock of ValidatorInterface until apiVersion 2.4
50-
$validator = $this->getMock('Symfony\Component\Validator\ValidatorInterface');
62+
// Verify that the constraints are added
63+
$metadata->expects($this->once())
64+
->method('addConstraint')
65+
->with($this->isInstanceOf('Symfony\Component\Form\Extension\Validator\Constraints\Form'));
5166

52-
$validator
53-
->expects($this->once())
54-
->method('getMetadataFactory')
55-
->will($this->returnValue($metaDataFactory))
56-
;
67+
$metadata->expects($this->once())
68+
->method('addPropertyConstraint')
69+
->with('children', $this->isInstanceOf('Symfony\Component\Validator\Constraints\Valid'));
5770

58-
$validatorExtension = new ValidatorExtension($validator);
59-
$this->assertAttributeSame($validator, 'validator', $validatorExtension);
71+
$extension = new ValidatorExtension($validator);
72+
$guesser = $extension->loadTypeGuesser();
73+
74+
$this->assertInstanceOf('Symfony\Component\Form\Extension\Validator\ValidatorTypeGuesser', $guesser);
6075
}
6176

6277
/**
63-
* @expectedException \InvalidArgumentException
78+
* @expectedException \Symfony\Component\Form\Exception\UnexpectedTypeException
6479
*/
6580
public function testInvalidValidatorInterface()
6681
{
6782
new ValidatorExtension(null);
6883
}
69-
70-
/**
71-
* @return mixed
72-
*/
73-
private function createClassMetaDataMock()
74-
{
75-
$classMetaData = $this->getMockBuilder('Symfony\Component\Validator\Mapping\ClassMetadata')
76-
->disableOriginalConstructor()
77-
->getMock();
78-
79-
$classMetaData
80-
->expects($this->once())
81-
->method('addConstraint')
82-
->with($this->isInstanceOf('Symfony\Component\Form\Extension\Validator\Constraints\Form'));
83-
$classMetaData
84-
->expects($this->once())
85-
->method('addPropertyConstraint')
86-
->with(
87-
$this->identicalTo('children'),
88-
$this->isInstanceOf('Symfony\Component\Validator\Constraints\Valid')
89-
);
90-
91-
return $classMetaData;
92-
}
9384
}

0 commit comments

Comments
 (0)