diff --git a/src/Symfony/Component/Form/Extension/Validator/EventListener/ValidationListener.php b/src/Symfony/Component/Form/Extension/Validator/EventListener/ValidationListener.php index 26d2bfdaa7..62c59ddc43 100644 --- a/src/Symfony/Component/Form/Extension/Validator/EventListener/ValidationListener.php +++ b/src/Symfony/Component/Form/Extension/Validator/EventListener/ValidationListener.php @@ -13,7 +13,8 @@ namespace Symfony\Component\Form\Extension\Validator\EventListener; use Symfony\Component\EventDispatcher\EventSubscriberInterface; use Symfony\Component\Form\Extension\Validator\ViolationMapper\ViolationMapperInterface; -use Symfony\Component\Validator\ValidatorInterface; +use Symfony\Component\Validator\Validator\ValidatorInterface; +use Symfony\Component\Validator\ValidatorInterface as LegacyValidatorInterface; use Symfony\Component\Form\FormEvents; use Symfony\Component\Form\FormEvent; use Symfony\Component\Form\Extension\Validator\Constraints\Form; @@ -35,8 +36,16 @@ class ValidationListener implements EventSubscriberInterface return array(FormEvents::POST_SUBMIT => 'validateForm'); } - public function __construct(ValidatorInterface $validator, ViolationMapperInterface $violationMapper) + /** + * @param ValidatorInterface|LegacyValidatorInterface $validator + * @param ViolationMapperInterface $violationMapper + */ + public function __construct($validator, ViolationMapperInterface $violationMapper) { + if (!$validator instanceof ValidatorInterface && !$validator instanceof LegacyValidatorInterface) { + throw new \InvalidArgumentException('Validator must be instance of Symfony\Component\Validator\Validator\ValidatorInterface or Symfony\Component\Validator\ValidatorInterface'); + } + $this->validator = $validator; $this->violationMapper = $violationMapper; } diff --git a/src/Symfony/Component/Form/Extension/Validator/Type/FormTypeValidatorExtension.php b/src/Symfony/Component/Form/Extension/Validator/Type/FormTypeValidatorExtension.php index 344bddadc1..644a46db93 100644 --- a/src/Symfony/Component/Form/Extension/Validator/Type/FormTypeValidatorExtension.php +++ b/src/Symfony/Component/Form/Extension/Validator/Type/FormTypeValidatorExtension.php @@ -14,7 +14,8 @@ namespace Symfony\Component\Form\Extension\Validator\Type; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\Form\Extension\Validator\ViolationMapper\ViolationMapper; use Symfony\Component\Form\Extension\Validator\EventListener\ValidationListener; -use Symfony\Component\Validator\ValidatorInterface; +use Symfony\Component\Validator\Validator\ValidatorInterface; +use Symfony\Component\Validator\ValidatorInterface as LegacyValidatorInterface; use Symfony\Component\OptionsResolver\Options; use Symfony\Component\OptionsResolver\OptionsResolverInterface; @@ -33,8 +34,15 @@ class FormTypeValidatorExtension extends BaseValidatorExtension */ private $violationMapper; - public function __construct(ValidatorInterface $validator) + /** + * @param ValidatorInterface|LegacyValidatorInterface $validator + */ + public function __construct($validator) { + if (!$validator instanceof ValidatorInterface && !$validator instanceof LegacyValidatorInterface) { + throw new \InvalidArgumentException('Validator must be instance of Symfony\Component\Validator\Validator\ValidatorInterface or Symfony\Component\Validator\ValidatorInterface'); + } + $this->validator = $validator; $this->violationMapper = new ViolationMapper(); } diff --git a/src/Symfony/Component/Form/Extension/Validator/ValidatorExtension.php b/src/Symfony/Component/Form/Extension/Validator/ValidatorExtension.php index 572a4ac938..88890ae651 100644 --- a/src/Symfony/Component/Form/Extension/Validator/ValidatorExtension.php +++ b/src/Symfony/Component/Form/Extension/Validator/ValidatorExtension.php @@ -13,8 +13,10 @@ namespace Symfony\Component\Form\Extension\Validator; use Symfony\Component\Form\Extension\Validator\Constraints\Form; use Symfony\Component\Form\AbstractExtension; -use Symfony\Component\Validator\ValidatorInterface; use Symfony\Component\Validator\Constraints\Valid; +use Symfony\Component\Validator\Mapping\ClassMetadata; +use Symfony\Component\Validator\Validator\ValidatorInterface; +use Symfony\Component\Validator\ValidatorInterface as LegacyValidatorInterface; /** * Extension supporting the Symfony2 Validator component in forms. @@ -25,17 +27,32 @@ class ValidatorExtension extends AbstractExtension { private $validator; - public function __construct(ValidatorInterface $validator) + /** + * @param ValidatorInterface|LegacyValidatorInterface $validator + */ + public function __construct($validator) { - $this->validator = $validator; + // since validator apiVersion 2.5 + if ($validator instanceof ValidatorInterface) { + $this->validator = $validator; + + /** @var $metadata ClassMetadata */ + $metadata = $this->validator->getMetadataFor('Symfony\Component\Form\Form'); + // until validator apiVersion 2.4 + } elseif ($validator instanceof LegacyValidatorInterface) { + $this->validator = $validator; + + /** @var $metadata ClassMetadata */ + $metadata = $this->validator->getMetadataFactory()->getMetadataFor('Symfony\Component\Form\Form'); + } else { + throw new \InvalidArgumentException('Validator must be instance of Symfony\Component\Validator\Validator\ValidatorInterface or Symfony\Component\Validator\ValidatorInterface'); + } // Register the form constraints in the validator programmatically. // This functionality is required when using the Form component without // the DIC, where the XML file is loaded automatically. Thus the following // code must be kept synchronized with validation.xml - /** @var \Symfony\Component\Validator\Mapping\ClassMetadata $metadata */ - $metadata = $this->validator->getMetadataFactory()->getMetadataFor('Symfony\Component\Form\Form'); $metadata->addConstraint(new Form()); $metadata->addPropertyConstraint('children', new Valid()); } diff --git a/src/Symfony/Component/Form/Tests/Extension/Validator/EventListener/ValidationListenerTest.php b/src/Symfony/Component/Form/Tests/Extension/Validator/EventListener/ValidationListenerTest.php index 8d8f9235d1..d819277db0 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Validator/EventListener/ValidationListenerTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Validator/EventListener/ValidationListenerTest.php @@ -158,4 +158,30 @@ class ValidationListenerTest extends \PHPUnit_Framework_TestCase $this->listener->validateForm(new FormEvent($form, null)); } + + public function testValidatorInterfaceSinceSymfony25() + { + // Mock of ValidatorInterface since apiVersion 2.5 + $validator = $this->getMock('Symfony\Component\Validator\Validator\ValidatorInterface'); + + $listener = new ValidationListener($validator, $this->violationMapper); + $this->assertAttributeSame($validator, 'validator', $listener); + } + + public function testValidatorInterfaceUntilSymfony24() + { + // Mock of ValidatorInterface until apiVersion 2.4 + $validator = $this->getMock('Symfony\Component\Validator\ValidatorInterface'); + + $listener = new ValidationListener($validator, $this->violationMapper); + $this->assertAttributeSame($validator, 'validator', $listener); + } + + /** + * @expectedException \InvalidArgumentException + */ + public function testInvalidValidatorInterface() + { + new ValidationListener(null, $this->violationMapper); + } } diff --git a/src/Symfony/Component/Form/Tests/Extension/Validator/Type/FormTypeValidatorExtensionTest.php b/src/Symfony/Component/Form/Tests/Extension/Validator/Type/FormTypeValidatorExtensionTest.php index 298306b57d..4ca10da50e 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Validator/Type/FormTypeValidatorExtensionTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Validator/Type/FormTypeValidatorExtensionTest.php @@ -11,6 +11,7 @@ namespace Symfony\Component\Form\Tests\Extension\Validator\Type; +use Symfony\Component\Form\Extension\Validator\Type\FormTypeValidatorExtension; use Symfony\Component\Validator\ConstraintViolationList; class FormTypeValidatorExtensionTest extends BaseValidatorExtensionTest @@ -36,6 +37,32 @@ class FormTypeValidatorExtensionTest extends BaseValidatorExtensionTest $form->submit(array()); } + public function testValidatorInterfaceSinceSymfony25() + { + // Mock of ValidatorInterface since apiVersion 2.5 + $validator = $this->getMock('Symfony\Component\Validator\Validator\ValidatorInterface'); + + $formTypeValidatorExtension = new FormTypeValidatorExtension($validator); + $this->assertAttributeSame($validator, 'validator', $formTypeValidatorExtension); + } + + public function testValidatorInterfaceUntilSymfony24() + { + // Mock of ValidatorInterface until apiVersion 2.4 + $validator = $this->getMock('Symfony\Component\Validator\ValidatorInterface'); + + $formTypeValidatorExtension = new FormTypeValidatorExtension($validator); + $this->assertAttributeSame($validator, 'validator', $formTypeValidatorExtension); + } + + /** + * @expectedException \InvalidArgumentException + */ + public function testInvalidValidatorInterface() + { + new FormTypeValidatorExtension(null); + } + protected function createForm(array $options = array()) { return $this->factory->create('form', null, $options); diff --git a/src/Symfony/Component/Form/Tests/Extension/Validator/ValidatorExtensionTest.php b/src/Symfony/Component/Form/Tests/Extension/Validator/ValidatorExtensionTest.php new file mode 100644 index 0000000000..bc69231fe2 --- /dev/null +++ b/src/Symfony/Component/Form/Tests/Extension/Validator/ValidatorExtensionTest.php @@ -0,0 +1,93 @@ + +* +* For the full copyright and license information, please view the LICENSE +* file that was distributed with this source code. +*/ + +namespace Symfony\Component\Form\Tests\Extension\Validator; + +use Symfony\Component\Form\Extension\Validator\ValidatorExtension; + +class ValidatorExtensionTest extends \PHPUnit_Framework_TestCase +{ + public function testValidatorInterfaceSinceSymfony25() + { + $classMetaData = $this->createClassMetaDataMock(); + + // Mock of ValidatorInterface since apiVersion 2.5 + $validator = $this->getMock('Symfony\Component\Validator\Validator\ValidatorInterface'); + + $validator + ->expects($this->once()) + ->method('getMetadataFor') + ->with($this->identicalTo('Symfony\Component\Form\Form')) + ->will($this->returnValue($classMetaData)) + ; + + $validatorExtension = new ValidatorExtension($validator); + $this->assertAttributeSame($validator, 'validator', $validatorExtension); + } + + public function testValidatorInterfaceUntilSymfony24() + { + $classMetaData = $this->createClassMetaDataMock(); + + $metaDataFactory = $this->getMock('Symfony\Component\Validator\MetadataFactoryInterface'); + + $metaDataFactory + ->expects($this->once()) + ->method('getMetadataFor') + ->with($this->identicalTo('Symfony\Component\Form\Form')) + ->will($this->returnValue($classMetaData)) + ; + + // Mock of ValidatorInterface until apiVersion 2.4 + $validator = $this->getMock('Symfony\Component\Validator\ValidatorInterface'); + + $validator + ->expects($this->once()) + ->method('getMetadataFactory') + ->will($this->returnValue($metaDataFactory)) + ; + + $validatorExtension = new ValidatorExtension($validator); + $this->assertAttributeSame($validator, 'validator', $validatorExtension); + } + + /** + * @expectedException \InvalidArgumentException + */ + public function testInvalidValidatorInterface() + { + new ValidatorExtension(null); + } + + /** + * @return mixed + */ + private function createClassMetaDataMock() + { + $classMetaData = $this->getMockBuilder('Symfony\Component\Validator\Mapping\ClassMetadata') + ->disableOriginalConstructor() + ->getMock(); + + $classMetaData + ->expects($this->once()) + ->method('addConstraint') + ->with($this->isInstanceOf('Symfony\Component\Form\Extension\Validator\Constraints\Form')); + $classMetaData + ->expects($this->once()) + ->method('addPropertyConstraint') + ->with( + $this->identicalTo('children'), + $this->isInstanceOf('Symfony\Component\Validator\Constraints\Valid') + ); + + return $classMetaData; + } +}