From 6c4455fef7643a99e3eedeb92d77fa4a764e8bc6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20H=C3=B6rl?= Date: Fri, 27 Jan 2012 02:33:45 +0100 Subject: [PATCH 1/7] [Validator] Added GroupSequenceProvider --- .../Constraints/GroupSequenceProvider.php | 31 +++++++++ .../Component/Validator/GraphWalker.php | 7 +- .../GroupSequenceProviderInterface.php | 28 ++++++++ .../Validator/Mapping/ClassMetadata.php | 66 +++++++++++++++++++ .../Mapping/Loader/AnnotationLoader.php | 3 + .../Mapping/Loader/XmlFileLoader.php | 4 ++ .../Mapping/Loader/YamlFileLoader.php | 4 ++ .../constraint-mapping-1.0.xsd | 10 +++ .../Component/Validator/Fixtures/Entity.php | 1 + .../Fixtures/GroupSequenceProvider.php | 20 ++++++ .../Validator/Mapping/ClassMetadataTest.php | 18 ++++- .../Mapping/Loader/AnnotationLoaderTest.php | 2 + .../Mapping/Loader/XmlFileLoaderTest.php | 1 + .../Mapping/Loader/YamlFileLoaderTest.php | 1 + .../Mapping/Loader/constraint-mapping.xml | 3 + .../Mapping/Loader/constraint-mapping.yml | 1 + .../Component/Validator/ValidatorTest.php | 47 +++++++++++++ 17 files changed, 245 insertions(+), 2 deletions(-) create mode 100644 src/Symfony/Component/Validator/Constraints/GroupSequenceProvider.php create mode 100644 src/Symfony/Component/Validator/GroupSequenceProviderInterface.php create mode 100644 tests/Symfony/Tests/Component/Validator/Fixtures/GroupSequenceProvider.php diff --git a/src/Symfony/Component/Validator/Constraints/GroupSequenceProvider.php b/src/Symfony/Component/Validator/Constraints/GroupSequenceProvider.php new file mode 100644 index 0000000000..c2b7e10787 --- /dev/null +++ b/src/Symfony/Component/Validator/Constraints/GroupSequenceProvider.php @@ -0,0 +1,31 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Validator\Constraints; + +/** + * Annotation to define a group sequence provider + * + * @Annotation + */ +class GroupSequenceProvider +{ + /** + * The name of the provider class + * @var string + */ + public $class; + + public function __construct(array $options) + { + $this->class = $options['value']; + } +} diff --git a/src/Symfony/Component/Validator/GraphWalker.php b/src/Symfony/Component/Validator/GraphWalker.php index dbdcfdb70e..5008748abb 100644 --- a/src/Symfony/Component/Validator/GraphWalker.php +++ b/src/Symfony/Component/Validator/GraphWalker.php @@ -67,8 +67,13 @@ class GraphWalker $initializer->initialize($object); } - if ($group === Constraint::DEFAULT_GROUP && $metadata->hasGroupSequence()) { + if ($group === Constraint::DEFAULT_GROUP && ($metadata->hasGroupSequence() || $metadata->hasGroupSequenceProvider())) { $groups = $metadata->getGroupSequence(); + + if ($groupSequenceProvider = $metadata->getGroupSequenceProvider()) { + $groups = $groupSequenceProvider->getValidationGroups($object); + } + foreach ($groups as $group) { $this->walkObjectForGroup($metadata, $object, $group, $propertyPath, Constraint::DEFAULT_GROUP); diff --git a/src/Symfony/Component/Validator/GroupSequenceProviderInterface.php b/src/Symfony/Component/Validator/GroupSequenceProviderInterface.php new file mode 100644 index 0000000000..5aceffc7e5 --- /dev/null +++ b/src/Symfony/Component/Validator/GroupSequenceProviderInterface.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Validator; + +/** + * Defines the interface for a group sequence provider. + */ +interface GroupSequenceProviderInterface +{ + /** + * Returns which validation groups should be used for a certain state + * of the object. + * + * @param mixed $object The object that is validated. + * + * @return array An array of validation groups + */ + function getValidationGroups($object); +} diff --git a/src/Symfony/Component/Validator/Mapping/ClassMetadata.php b/src/Symfony/Component/Validator/Mapping/ClassMetadata.php index 237d854cbb..3dac6a9c09 100644 --- a/src/Symfony/Component/Validator/Mapping/ClassMetadata.php +++ b/src/Symfony/Component/Validator/Mapping/ClassMetadata.php @@ -14,6 +14,7 @@ namespace Symfony\Component\Validator\Mapping; use Symfony\Component\Validator\Constraint; use Symfony\Component\Validator\Exception\ConstraintDefinitionException; use Symfony\Component\Validator\Exception\GroupDefinitionException; +use Symfony\Component\Validator\GroupSequenceProviderInterface; /** * Represents all the configured constraints on a given class. @@ -29,6 +30,8 @@ class ClassMetadata extends ElementMetadata public $properties = array(); public $getters = array(); public $groupSequence = array(); + public $groupSequenceProviderClass; + public $groupSequenceProvider; private $reflClass; /** @@ -57,6 +60,7 @@ class ClassMetadata extends ElementMetadata return array_merge(parent::__sleep(), array( 'getters', 'groupSequence', + 'groupSequenceProviderClass', 'members', 'name', 'properties', @@ -293,4 +297,66 @@ class ClassMetadata extends ElementMetadata return $this->reflClass; } + + /** + * Sets the class name of the group sequence provider. + * + * @param string $class Sequence provider class name + */ + public function setGroupSequenceProviderClass($class) + { + $this->groupSequenceProviderClass = $class; + $this->groupSequenceProvider = null; + } + + /** + * Returns the name of the group sequence provider class. + * + * @return string Class name + */ + public function getGroupSequenceProviderClass() + { + return $this->groupSequenceProviderClass; + } + + /** + * Returns whether a group sequence provider is set. + * + * @return boolean + */ + public function hasGroupSequenceProvider() + { + return $this->groupSequenceProviderClass || $this->groupSequenceProvider; + } + + /** + * Returns the group sequence provider if specified. + * + * @return GroupSequenceProviderInterface The provider or null + */ + public function getGroupSequenceProvider() + { + if (!$this->groupSequenceProvider && $this->groupSequenceProviderClass) { + $reflClass = new \ReflectionClass($this->groupSequenceProviderClass); + $interface = 'Symfony\Component\Validator\GroupSequenceProviderInterface'; + + if (!$reflClass->implementsInterface($interface)) { + throw new \InvalidArgumentException(sprintf('The class "%s" must implement interface "%s".', $this->groupSequenceProviderClass, $interface)); + } + + $this->groupSequenceProvider = $reflClass->newInstance(); + } + + return $this->groupSequenceProvider; + } + + /** + * Sets the group sequence provider. + * + * @param GroupSequenceProviderInterface $provider Group sequence provider + */ + public function setGroupSequenceProvider(GroupSequenceProviderInterface $provider) + { + $this->groupSequenceProvider = $provider; + } } diff --git a/src/Symfony/Component/Validator/Mapping/Loader/AnnotationLoader.php b/src/Symfony/Component/Validator/Mapping/Loader/AnnotationLoader.php index 2474dba79f..630aa2ff31 100644 --- a/src/Symfony/Component/Validator/Mapping/Loader/AnnotationLoader.php +++ b/src/Symfony/Component/Validator/Mapping/Loader/AnnotationLoader.php @@ -15,6 +15,7 @@ use Doctrine\Common\Annotations\Reader; use Symfony\Component\Validator\Exception\MappingException; use Symfony\Component\Validator\Mapping\ClassMetadata; use Symfony\Component\Validator\Constraints\GroupSequence; +use Symfony\Component\Validator\Constraints\GroupSequenceProvider; use Symfony\Component\Validator\Constraint; class AnnotationLoader implements LoaderInterface @@ -38,6 +39,8 @@ class AnnotationLoader implements LoaderInterface foreach ($this->reader->getClassAnnotations($reflClass) as $constraint) { if ($constraint instanceof GroupSequence) { $metadata->setGroupSequence($constraint->groups); + } elseif ($constraint instanceof GroupSequenceProvider) { + $metadata->setGroupSequenceProviderClass($constraint->class); } elseif ($constraint instanceof Constraint) { $metadata->addConstraint($constraint); } diff --git a/src/Symfony/Component/Validator/Mapping/Loader/XmlFileLoader.php b/src/Symfony/Component/Validator/Mapping/Loader/XmlFileLoader.php index ef130d4b42..ae48f226ff 100644 --- a/src/Symfony/Component/Validator/Mapping/Loader/XmlFileLoader.php +++ b/src/Symfony/Component/Validator/Mapping/Loader/XmlFileLoader.php @@ -43,6 +43,10 @@ class XmlFileLoader extends FileLoader if (isset($this->classes[$metadata->getClassName()])) { $xml = $this->classes[$metadata->getClassName()]; + foreach ($xml->{'group-sequence-provider'} as $provider) { + $metadata->setGroupSequenceProviderClass($provider['class']); + } + foreach ($this->parseConstraints($xml->constraint) as $constraint) { $metadata->addConstraint($constraint); } diff --git a/src/Symfony/Component/Validator/Mapping/Loader/YamlFileLoader.php b/src/Symfony/Component/Validator/Mapping/Loader/YamlFileLoader.php index c25e49cab3..62750f40a5 100644 --- a/src/Symfony/Component/Validator/Mapping/Loader/YamlFileLoader.php +++ b/src/Symfony/Component/Validator/Mapping/Loader/YamlFileLoader.php @@ -54,6 +54,10 @@ class YamlFileLoader extends FileLoader if (isset($this->classes[$metadata->getClassName()])) { $yaml = $this->classes[$metadata->getClassName()]; + if (isset($yaml['group_sequence_provider'])) { + $metadata->setGroupSequenceProviderClass($yaml['group_sequence_provider']); + } + if (isset($yaml['constraints'])) { foreach ($this->parseNodes($yaml['constraints']) as $constraint) { $metadata->addConstraint($constraint); diff --git a/src/Symfony/Component/Validator/Mapping/Loader/schema/dic/constraint-mapping/constraint-mapping-1.0.xsd b/src/Symfony/Component/Validator/Mapping/Loader/schema/dic/constraint-mapping/constraint-mapping-1.0.xsd index 61232da570..f16a736d5e 100644 --- a/src/Symfony/Component/Validator/Mapping/Loader/schema/dic/constraint-mapping/constraint-mapping-1.0.xsd +++ b/src/Symfony/Component/Validator/Mapping/Loader/schema/dic/constraint-mapping/constraint-mapping-1.0.xsd @@ -52,6 +52,7 @@ ]]> + @@ -59,6 +60,15 @@ + + + + + + + groups = $groups; + } + + public function getValidationGroups($object) + { + return $this->groups; + } +} diff --git a/tests/Symfony/Tests/Component/Validator/Mapping/ClassMetadataTest.php b/tests/Symfony/Tests/Component/Validator/Mapping/ClassMetadataTest.php index 5ec7abff8b..87d2ef4144 100644 --- a/tests/Symfony/Tests/Component/Validator/Mapping/ClassMetadataTest.php +++ b/tests/Symfony/Tests/Component/Validator/Mapping/ClassMetadataTest.php @@ -18,11 +18,13 @@ use Symfony\Tests\Component\Validator\Fixtures\Entity; use Symfony\Tests\Component\Validator\Fixtures\ConstraintA; use Symfony\Tests\Component\Validator\Fixtures\ConstraintB; use Symfony\Tests\Component\Validator\Fixtures\PropertyConstraint; +use Symfony\Tests\Component\Validator\Fixtures\GroupSequenceProvider; require_once __DIR__.'/../Fixtures/Entity.php'; require_once __DIR__.'/../Fixtures/ConstraintA.php'; require_once __DIR__.'/../Fixtures/ConstraintB.php'; require_once __DIR__.'/../Fixtures/PropertyConstraint.php'; +require_once __DIR__.'/../Fixtures/GroupSequenceProvider.php'; class ClassMetadataTest extends \PHPUnit_Framework_TestCase { @@ -189,5 +191,19 @@ class ClassMetadataTest extends \PHPUnit_Framework_TestCase $this->metadata->setGroupSequence(array('Foo', $this->metadata->getDefaultGroup(), Constraint::DEFAULT_GROUP)); } -} + public function testGroupSequenceProvider() + { + $this->assertNull($this->metadata->getGroupSequenceProvider()); + + $this->metadata->setGroupSequenceProviderClass('stdClass'); + + try { + $this->metadata->getGroupSequenceProvider(); + $this->fail(); + } catch(\InvalidArgumentException $e) {} + + $this->metadata->setGroupSequenceProviderClass('Symfony\Tests\Component\Validator\Fixtures\GroupSequenceProvider'); + $this->assertTrue($this->metadata->getGroupSequenceProvider() instanceof GroupSequenceProvider); + } +} diff --git a/tests/Symfony/Tests/Component/Validator/Mapping/Loader/AnnotationLoaderTest.php b/tests/Symfony/Tests/Component/Validator/Mapping/Loader/AnnotationLoaderTest.php index 58f215c9fa..adaeee9423 100644 --- a/tests/Symfony/Tests/Component/Validator/Mapping/Loader/AnnotationLoaderTest.php +++ b/tests/Symfony/Tests/Component/Validator/Mapping/Loader/AnnotationLoaderTest.php @@ -73,6 +73,7 @@ class AnnotationLoaderTest extends \PHPUnit_Framework_TestCase 'choices' => array('A', 'B'), ))); $expected->addGetterConstraint('lastName', new NotNull()); + $expected->setGroupSequenceProviderClass('Symfony\Tests\Component\Validator\Fixtures\GroupSequenceProvider'); // load reflection class so that the comparison passes $expected->getReflectionClass(); @@ -137,6 +138,7 @@ class AnnotationLoaderTest extends \PHPUnit_Framework_TestCase 'choices' => array('A', 'B'), ))); $expected->addGetterConstraint('lastName', new NotNull()); + $expected->setGroupSequenceProviderClass('Symfony\Tests\Component\Validator\Fixtures\GroupSequenceProvider'); // load reflection class so that the comparison passes $expected->getReflectionClass(); diff --git a/tests/Symfony/Tests/Component/Validator/Mapping/Loader/XmlFileLoaderTest.php b/tests/Symfony/Tests/Component/Validator/Mapping/Loader/XmlFileLoaderTest.php index 8746422aac..035c0f786b 100644 --- a/tests/Symfony/Tests/Component/Validator/Mapping/Loader/XmlFileLoaderTest.php +++ b/tests/Symfony/Tests/Component/Validator/Mapping/Loader/XmlFileLoaderTest.php @@ -67,6 +67,7 @@ class XmlFileLoaderTest extends \PHPUnit_Framework_TestCase 'choices' => array('A', 'B'), ))); $expected->addGetterConstraint('lastName', new NotNull()); + $expected->setGroupSequenceProviderClass('Symfony\Tests\Component\Validator\Fixtures\GroupSequenceProvider'); $this->assertEquals($expected, $metadata); } diff --git a/tests/Symfony/Tests/Component/Validator/Mapping/Loader/YamlFileLoaderTest.php b/tests/Symfony/Tests/Component/Validator/Mapping/Loader/YamlFileLoaderTest.php index b661efbf94..de6c687b7f 100644 --- a/tests/Symfony/Tests/Component/Validator/Mapping/Loader/YamlFileLoaderTest.php +++ b/tests/Symfony/Tests/Component/Validator/Mapping/Loader/YamlFileLoaderTest.php @@ -85,6 +85,7 @@ class YamlFileLoaderTest extends \PHPUnit_Framework_TestCase 'choices' => array('A', 'B'), ))); $expected->addGetterConstraint('lastName', new NotNull()); + $expected->setGroupSequenceProviderClass('Symfony\Tests\Component\Validator\Fixtures\GroupSequenceProvider'); $this->assertEquals($expected, $metadata); } diff --git a/tests/Symfony/Tests/Component/Validator/Mapping/Loader/constraint-mapping.xml b/tests/Symfony/Tests/Component/Validator/Mapping/Loader/constraint-mapping.xml index 03c2467951..cd669e51f4 100644 --- a/tests/Symfony/Tests/Component/Validator/Mapping/Loader/constraint-mapping.xml +++ b/tests/Symfony/Tests/Component/Validator/Mapping/Loader/constraint-mapping.xml @@ -8,6 +8,9 @@ + + + diff --git a/tests/Symfony/Tests/Component/Validator/Mapping/Loader/constraint-mapping.yml b/tests/Symfony/Tests/Component/Validator/Mapping/Loader/constraint-mapping.yml index ea1ba6fec9..0d0083ae59 100644 --- a/tests/Symfony/Tests/Component/Validator/Mapping/Loader/constraint-mapping.yml +++ b/tests/Symfony/Tests/Component/Validator/Mapping/Loader/constraint-mapping.yml @@ -2,6 +2,7 @@ namespaces: custom: Symfony\Tests\Component\Validator\Fixtures\ Symfony\Tests\Component\Validator\Fixtures\Entity: + group_sequence_provider: Symfony\Tests\Component\Validator\Fixtures\GroupSequenceProvider constraints: # Custom constraint - Symfony\Tests\Component\Validator\Fixtures\ConstraintA: ~ diff --git a/tests/Symfony/Tests/Component/Validator/ValidatorTest.php b/tests/Symfony/Tests/Component/Validator/ValidatorTest.php index b07e596a10..722f31472e 100644 --- a/tests/Symfony/Tests/Component/Validator/ValidatorTest.php +++ b/tests/Symfony/Tests/Component/Validator/ValidatorTest.php @@ -19,6 +19,7 @@ require_once __DIR__.'/Fixtures/FakeClassMetadataFactory.php'; use Symfony\Tests\Component\Validator\Fixtures\Entity; use Symfony\Tests\Component\Validator\Fixtures\FakeClassMetadataFactory; use Symfony\Tests\Component\Validator\Fixtures\FailingConstraint; +use Symfony\Tests\Component\Validator\Fixtures\GroupSequenceProvider; use Symfony\Component\Validator\Validator; use Symfony\Component\Validator\ConstraintViolation; use Symfony\Component\Validator\ConstraintViolationList; @@ -122,6 +123,52 @@ class ValidatorTest extends \PHPUnit_Framework_TestCase $this->assertEquals($violations, $result); } + public function testValidate_groupSequenceProvider() + { + $groupSequenceProvider = new GroupSequenceProvider; + + $entity = new Entity(); + $metadata = new ClassMetadata(get_class($entity)); + $metadata->addPropertyConstraint('firstName', new FailingConstraint(array( + 'groups' => 'First', + ))); + $metadata->addPropertyConstraint('lastName', new FailingConstraint(array( + 'groups' => 'Second', + ))); + $metadata->setGroupSequenceProvider($groupSequenceProvider); + $this->factory->addClassMetadata($metadata); + + $violations = new ConstraintViolationList(); + $violations->add(new ConstraintViolation( + '', + array(), + $entity, + 'firstName', + '' + )); + + $groupSequenceProvider->setGroups(array('First')); + $result = $this->validator->validate($entity); + $this->assertEquals($violations, $result); + + $violations = new ConstraintViolationList(); + $violations->add(new ConstraintViolation( + '', + array(), + $entity, + 'lastName', + '' + )); + + $groupSequenceProvider->setGroups(array('Second')); + $result = $this->validator->validate($entity); + $this->assertEquals($violations, $result); + + $groupSequenceProvider->setGroups(array()); + $result = $this->validator->validate($entity); + $this->assertEquals(new ConstraintViolationList(), $result); + } + public function testValidateProperty() { $entity = new Entity(); From c3b04a333686a84b0a6d0380f7be186bff7114a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20H=C3=B6rl?= Date: Sat, 28 Jan 2012 22:10:33 +0100 Subject: [PATCH 2/7] [Validator] Changed GroupSequenceProvider implementation --- .../Constraints/GroupSequenceProvider.php | 8 +-- .../Component/Validator/GraphWalker.php | 8 ++- .../GroupSequenceProviderInterface.php | 4 +- .../Validator/Mapping/ClassMetadata.php | 70 +++++-------------- .../Mapping/ClassMetadataFactory.php | 3 + .../Mapping/Loader/AnnotationLoader.php | 2 +- .../Mapping/Loader/XmlFileLoader.php | 2 +- .../Mapping/Loader/YamlFileLoader.php | 2 +- .../constraint-mapping-1.0.xsd | 2 +- .../Component/Validator/Fixtures/Entity.php | 15 +++- .../Fixtures/GroupSequenceProvider.php | 20 ------ .../Validator/Mapping/ClassMetadataTest.php | 14 ++-- .../Mapping/Loader/AnnotationLoaderTest.php | 4 +- .../Mapping/Loader/XmlFileLoaderTest.php | 2 +- .../Mapping/Loader/YamlFileLoaderTest.php | 2 +- .../Mapping/Loader/constraint-mapping.xml | 2 +- .../Mapping/Loader/constraint-mapping.yml | 2 +- .../Component/Validator/ValidatorTest.php | 11 ++- 18 files changed, 66 insertions(+), 107 deletions(-) delete mode 100644 tests/Symfony/Tests/Component/Validator/Fixtures/GroupSequenceProvider.php diff --git a/src/Symfony/Component/Validator/Constraints/GroupSequenceProvider.php b/src/Symfony/Component/Validator/Constraints/GroupSequenceProvider.php index c2b7e10787..c6650842d7 100644 --- a/src/Symfony/Component/Validator/Constraints/GroupSequenceProvider.php +++ b/src/Symfony/Component/Validator/Constraints/GroupSequenceProvider.php @@ -19,13 +19,13 @@ namespace Symfony\Component\Validator\Constraints; class GroupSequenceProvider { /** - * The name of the provider class - * @var string + * True if the group sequence provider should be used + * @var boolean */ - public $class; + public $active; public function __construct(array $options) { - $this->class = $options['value']; + $this->active = (bool)$options['value']; } } diff --git a/src/Symfony/Component/Validator/GraphWalker.php b/src/Symfony/Component/Validator/GraphWalker.php index 5008748abb..489605b1d1 100644 --- a/src/Symfony/Component/Validator/GraphWalker.php +++ b/src/Symfony/Component/Validator/GraphWalker.php @@ -17,6 +17,7 @@ use Symfony\Component\Validator\Exception\UnexpectedTypeException; use Symfony\Component\Validator\Mapping\ClassMetadataFactoryInterface; use Symfony\Component\Validator\Mapping\ClassMetadata; use Symfony\Component\Validator\Mapping\MemberMetadata; +use Symfony\Component\Validator\GroupSequenceProviderInterface; /** * Responsible for walking over and initializing validation on different @@ -68,10 +69,11 @@ class GraphWalker } if ($group === Constraint::DEFAULT_GROUP && ($metadata->hasGroupSequence() || $metadata->hasGroupSequenceProvider())) { - $groups = $metadata->getGroupSequence(); - if ($groupSequenceProvider = $metadata->getGroupSequenceProvider()) { - $groups = $groupSequenceProvider->getValidationGroups($object); + if ($metadata->hasGroupSequence()) { + $groups = $metadata->getGroupSequence(); + } else { + $groups = $object->getValidationGroups(); } foreach ($groups as $group) { diff --git a/src/Symfony/Component/Validator/GroupSequenceProviderInterface.php b/src/Symfony/Component/Validator/GroupSequenceProviderInterface.php index 5aceffc7e5..0265691a6d 100644 --- a/src/Symfony/Component/Validator/GroupSequenceProviderInterface.php +++ b/src/Symfony/Component/Validator/GroupSequenceProviderInterface.php @@ -20,9 +20,7 @@ interface GroupSequenceProviderInterface * Returns which validation groups should be used for a certain state * of the object. * - * @param mixed $object The object that is validated. - * * @return array An array of validation groups */ - function getValidationGroups($object); + function getValidationGroups(); } diff --git a/src/Symfony/Component/Validator/Mapping/ClassMetadata.php b/src/Symfony/Component/Validator/Mapping/ClassMetadata.php index 3dac6a9c09..a59092ba7f 100644 --- a/src/Symfony/Component/Validator/Mapping/ClassMetadata.php +++ b/src/Symfony/Component/Validator/Mapping/ClassMetadata.php @@ -14,7 +14,6 @@ namespace Symfony\Component\Validator\Mapping; use Symfony\Component\Validator\Constraint; use Symfony\Component\Validator\Exception\ConstraintDefinitionException; use Symfony\Component\Validator\Exception\GroupDefinitionException; -use Symfony\Component\Validator\GroupSequenceProviderInterface; /** * Represents all the configured constraints on a given class. @@ -30,8 +29,7 @@ class ClassMetadata extends ElementMetadata public $properties = array(); public $getters = array(); public $groupSequence = array(); - public $groupSequenceProviderClass; - public $groupSequenceProvider; + public $groupSequenceProvider = false; private $reflClass; /** @@ -60,7 +58,7 @@ class ClassMetadata extends ElementMetadata return array_merge(parent::__sleep(), array( 'getters', 'groupSequence', - 'groupSequenceProviderClass', + 'groupSequenceProvider', 'members', 'name', 'properties', @@ -251,6 +249,10 @@ class ClassMetadata extends ElementMetadata */ public function setGroupSequence(array $groups) { + if ($this->hasGroupSequenceProvider()) { + throw new GroupDefinitionException('Defining a static group sequence is not allowed with a group sequence provider'); + } + if (in_array(Constraint::DEFAULT_GROUP, $groups, true)) { throw new GroupDefinitionException(sprintf('The group "%s" is not allowed in group sequences', Constraint::DEFAULT_GROUP)); } @@ -299,64 +301,30 @@ class ClassMetadata extends ElementMetadata } /** - * Sets the class name of the group sequence provider. + * Sets whether a group sequence provider should be used * - * @param string $class Sequence provider class name + * @param boolean $active */ - public function setGroupSequenceProviderClass($class) + public function setGroupSequenceProvider($active) { - $this->groupSequenceProviderClass = $class; - $this->groupSequenceProvider = null; + if ($this->hasGroupSequenceProvider()) { + throw new GroupDefinitionException('Defining a group sequence provider is not allowed with a static group sequence'); + } + + if (!$this->getReflectionClass()->implementsInterface('Symfony\Component\Validator\GroupSequenceProviderInterface')) { + throw new GroupDefinitionException(sprintf('Class "%s" must implement GroupSequenceProviderInterface', $this->name)); + } + + $this->groupSequenceProvider = $active; } /** - * Returns the name of the group sequence provider class. - * - * @return string Class name - */ - public function getGroupSequenceProviderClass() - { - return $this->groupSequenceProviderClass; - } - - /** - * Returns whether a group sequence provider is set. + * Returns whether the class has a group sequence provider. * * @return boolean */ public function hasGroupSequenceProvider() { - return $this->groupSequenceProviderClass || $this->groupSequenceProvider; - } - - /** - * Returns the group sequence provider if specified. - * - * @return GroupSequenceProviderInterface The provider or null - */ - public function getGroupSequenceProvider() - { - if (!$this->groupSequenceProvider && $this->groupSequenceProviderClass) { - $reflClass = new \ReflectionClass($this->groupSequenceProviderClass); - $interface = 'Symfony\Component\Validator\GroupSequenceProviderInterface'; - - if (!$reflClass->implementsInterface($interface)) { - throw new \InvalidArgumentException(sprintf('The class "%s" must implement interface "%s".', $this->groupSequenceProviderClass, $interface)); - } - - $this->groupSequenceProvider = $reflClass->newInstance(); - } - return $this->groupSequenceProvider; } - - /** - * Sets the group sequence provider. - * - * @param GroupSequenceProviderInterface $provider Group sequence provider - */ - public function setGroupSequenceProvider(GroupSequenceProviderInterface $provider) - { - $this->groupSequenceProvider = $provider; - } } diff --git a/src/Symfony/Component/Validator/Mapping/ClassMetadataFactory.php b/src/Symfony/Component/Validator/Mapping/ClassMetadataFactory.php index a16dfdc3b6..691f830c88 100644 --- a/src/Symfony/Component/Validator/Mapping/ClassMetadataFactory.php +++ b/src/Symfony/Component/Validator/Mapping/ClassMetadataFactory.php @@ -58,6 +58,9 @@ class ClassMetadataFactory implements ClassMetadataFactoryInterface // Include constraints from all implemented interfaces foreach ($metadata->getReflectionClass()->getInterfaces() as $interface) { + if ('Symfony\Component\Validator\GroupSequenceProviderInterface' === $interface->getName()) { + continue; + } $metadata->mergeConstraints($this->getClassMetadata($interface->getName())); } diff --git a/src/Symfony/Component/Validator/Mapping/Loader/AnnotationLoader.php b/src/Symfony/Component/Validator/Mapping/Loader/AnnotationLoader.php index 630aa2ff31..b67c9d7bcd 100644 --- a/src/Symfony/Component/Validator/Mapping/Loader/AnnotationLoader.php +++ b/src/Symfony/Component/Validator/Mapping/Loader/AnnotationLoader.php @@ -40,7 +40,7 @@ class AnnotationLoader implements LoaderInterface if ($constraint instanceof GroupSequence) { $metadata->setGroupSequence($constraint->groups); } elseif ($constraint instanceof GroupSequenceProvider) { - $metadata->setGroupSequenceProviderClass($constraint->class); + $metadata->setGroupSequenceProvider($constraint->active); } elseif ($constraint instanceof Constraint) { $metadata->addConstraint($constraint); } diff --git a/src/Symfony/Component/Validator/Mapping/Loader/XmlFileLoader.php b/src/Symfony/Component/Validator/Mapping/Loader/XmlFileLoader.php index ae48f226ff..0e3bedeaca 100644 --- a/src/Symfony/Component/Validator/Mapping/Loader/XmlFileLoader.php +++ b/src/Symfony/Component/Validator/Mapping/Loader/XmlFileLoader.php @@ -44,7 +44,7 @@ class XmlFileLoader extends FileLoader $xml = $this->classes[$metadata->getClassName()]; foreach ($xml->{'group-sequence-provider'} as $provider) { - $metadata->setGroupSequenceProviderClass($provider['class']); + $metadata->setGroupSequenceProvider((bool)$provider['active']); } foreach ($this->parseConstraints($xml->constraint) as $constraint) { diff --git a/src/Symfony/Component/Validator/Mapping/Loader/YamlFileLoader.php b/src/Symfony/Component/Validator/Mapping/Loader/YamlFileLoader.php index 62750f40a5..db65f684bb 100644 --- a/src/Symfony/Component/Validator/Mapping/Loader/YamlFileLoader.php +++ b/src/Symfony/Component/Validator/Mapping/Loader/YamlFileLoader.php @@ -55,7 +55,7 @@ class YamlFileLoader extends FileLoader $yaml = $this->classes[$metadata->getClassName()]; if (isset($yaml['group_sequence_provider'])) { - $metadata->setGroupSequenceProviderClass($yaml['group_sequence_provider']); + $metadata->setGroupSequenceProvider((bool)$yaml['group_sequence_provider']); } if (isset($yaml['constraints'])) { diff --git a/src/Symfony/Component/Validator/Mapping/Loader/schema/dic/constraint-mapping/constraint-mapping-1.0.xsd b/src/Symfony/Component/Validator/Mapping/Loader/schema/dic/constraint-mapping/constraint-mapping-1.0.xsd index f16a736d5e..60a91be73e 100644 --- a/src/Symfony/Component/Validator/Mapping/Loader/schema/dic/constraint-mapping/constraint-mapping-1.0.xsd +++ b/src/Symfony/Component/Validator/Mapping/Loader/schema/dic/constraint-mapping/constraint-mapping-1.0.xsd @@ -66,7 +66,7 @@ Defines the name of the group sequence provider for a class. ]]> - + diff --git a/tests/Symfony/Tests/Component/Validator/Fixtures/Entity.php b/tests/Symfony/Tests/Component/Validator/Fixtures/Entity.php index 6b540e84c1..62aaa15ea4 100644 --- a/tests/Symfony/Tests/Component/Validator/Fixtures/Entity.php +++ b/tests/Symfony/Tests/Component/Validator/Fixtures/Entity.php @@ -6,13 +6,14 @@ require_once __DIR__.'/EntityParent.php'; require_once __DIR__.'/EntityInterface.php'; use Symfony\Component\Validator\Constraints as Assert; +use Symfony\Component\Validator\GroupSequenceProviderInterface; /** * @Symfony\Tests\Component\Validator\Fixtures\ConstraintA * @Assert\GroupSequence({"Foo", "Entity"}) * @Assert\GroupSequenceProvider("Symfony\Tests\Component\Validator\Fixtures\GroupSequenceProvider") */ -class Entity extends EntityParent implements EntityInterface +class Entity extends EntityParent implements EntityInterface, GroupSequenceProviderInterface { /** * @Assert\NotNull @@ -29,6 +30,8 @@ class Entity extends EntityParent implements EntityInterface protected $lastName; public $reference; + protected $groups = array(); + private $internal; public function __construct($internal = null) @@ -48,4 +51,14 @@ class Entity extends EntityParent implements EntityInterface { return $this->lastName; } + + public function setGroups($groups) + { + $this->groups = $groups; + } + + public function getValidationGroups() + { + return $this->groups; + } } diff --git a/tests/Symfony/Tests/Component/Validator/Fixtures/GroupSequenceProvider.php b/tests/Symfony/Tests/Component/Validator/Fixtures/GroupSequenceProvider.php deleted file mode 100644 index 3e9cf9c1b6..0000000000 --- a/tests/Symfony/Tests/Component/Validator/Fixtures/GroupSequenceProvider.php +++ /dev/null @@ -1,20 +0,0 @@ -groups = $groups; - } - - public function getValidationGroups($object) - { - return $this->groups; - } -} diff --git a/tests/Symfony/Tests/Component/Validator/Mapping/ClassMetadataTest.php b/tests/Symfony/Tests/Component/Validator/Mapping/ClassMetadataTest.php index 87d2ef4144..646c06e08a 100644 --- a/tests/Symfony/Tests/Component/Validator/Mapping/ClassMetadataTest.php +++ b/tests/Symfony/Tests/Component/Validator/Mapping/ClassMetadataTest.php @@ -14,6 +14,7 @@ namespace Symfony\Tests\Component\Validator\Mapping; use Symfony\Component\Validator\Constraint; use Symfony\Component\Validator\Constraints\Valid; use Symfony\Component\Validator\Mapping\ClassMetadata; +use Symfony\Component\Validator\Exception\GroupDefinitionException; use Symfony\Tests\Component\Validator\Fixtures\Entity; use Symfony\Tests\Component\Validator\Fixtures\ConstraintA; use Symfony\Tests\Component\Validator\Fixtures\ConstraintB; @@ -24,7 +25,6 @@ require_once __DIR__.'/../Fixtures/Entity.php'; require_once __DIR__.'/../Fixtures/ConstraintA.php'; require_once __DIR__.'/../Fixtures/ConstraintB.php'; require_once __DIR__.'/../Fixtures/PropertyConstraint.php'; -require_once __DIR__.'/../Fixtures/GroupSequenceProvider.php'; class ClassMetadataTest extends \PHPUnit_Framework_TestCase { @@ -194,16 +194,14 @@ class ClassMetadataTest extends \PHPUnit_Framework_TestCase public function testGroupSequenceProvider() { - $this->assertNull($this->metadata->getGroupSequenceProvider()); - - $this->metadata->setGroupSequenceProviderClass('stdClass'); + $metadata = new ClassMetadata('stdClass'); try { - $this->metadata->getGroupSequenceProvider(); + $metadata->setGroupSequenceProvider(true); $this->fail(); - } catch(\InvalidArgumentException $e) {} + } catch(GroupDefinitionException $e) {} - $this->metadata->setGroupSequenceProviderClass('Symfony\Tests\Component\Validator\Fixtures\GroupSequenceProvider'); - $this->assertTrue($this->metadata->getGroupSequenceProvider() instanceof GroupSequenceProvider); + $this->metadata->setGroupSequenceProvider(true); + $this->assertTrue($this->metadata->hasGroupSequenceProvider()); } } diff --git a/tests/Symfony/Tests/Component/Validator/Mapping/Loader/AnnotationLoaderTest.php b/tests/Symfony/Tests/Component/Validator/Mapping/Loader/AnnotationLoaderTest.php index adaeee9423..cf9f30669f 100644 --- a/tests/Symfony/Tests/Component/Validator/Mapping/Loader/AnnotationLoaderTest.php +++ b/tests/Symfony/Tests/Component/Validator/Mapping/Loader/AnnotationLoaderTest.php @@ -73,7 +73,7 @@ class AnnotationLoaderTest extends \PHPUnit_Framework_TestCase 'choices' => array('A', 'B'), ))); $expected->addGetterConstraint('lastName', new NotNull()); - $expected->setGroupSequenceProviderClass('Symfony\Tests\Component\Validator\Fixtures\GroupSequenceProvider'); + $expected->setGroupSequenceProvider(true); // load reflection class so that the comparison passes $expected->getReflectionClass(); @@ -138,7 +138,7 @@ class AnnotationLoaderTest extends \PHPUnit_Framework_TestCase 'choices' => array('A', 'B'), ))); $expected->addGetterConstraint('lastName', new NotNull()); - $expected->setGroupSequenceProviderClass('Symfony\Tests\Component\Validator\Fixtures\GroupSequenceProvider'); + $expected->setGroupSequenceProvider(true); // load reflection class so that the comparison passes $expected->getReflectionClass(); diff --git a/tests/Symfony/Tests/Component/Validator/Mapping/Loader/XmlFileLoaderTest.php b/tests/Symfony/Tests/Component/Validator/Mapping/Loader/XmlFileLoaderTest.php index 035c0f786b..5aa47b001e 100644 --- a/tests/Symfony/Tests/Component/Validator/Mapping/Loader/XmlFileLoaderTest.php +++ b/tests/Symfony/Tests/Component/Validator/Mapping/Loader/XmlFileLoaderTest.php @@ -67,7 +67,7 @@ class XmlFileLoaderTest extends \PHPUnit_Framework_TestCase 'choices' => array('A', 'B'), ))); $expected->addGetterConstraint('lastName', new NotNull()); - $expected->setGroupSequenceProviderClass('Symfony\Tests\Component\Validator\Fixtures\GroupSequenceProvider'); + $expected->setGroupSequenceProvider(true); $this->assertEquals($expected, $metadata); } diff --git a/tests/Symfony/Tests/Component/Validator/Mapping/Loader/YamlFileLoaderTest.php b/tests/Symfony/Tests/Component/Validator/Mapping/Loader/YamlFileLoaderTest.php index de6c687b7f..a1d54e5b9c 100644 --- a/tests/Symfony/Tests/Component/Validator/Mapping/Loader/YamlFileLoaderTest.php +++ b/tests/Symfony/Tests/Component/Validator/Mapping/Loader/YamlFileLoaderTest.php @@ -85,7 +85,7 @@ class YamlFileLoaderTest extends \PHPUnit_Framework_TestCase 'choices' => array('A', 'B'), ))); $expected->addGetterConstraint('lastName', new NotNull()); - $expected->setGroupSequenceProviderClass('Symfony\Tests\Component\Validator\Fixtures\GroupSequenceProvider'); + $expected->setGroupSequenceProvider(true); $this->assertEquals($expected, $metadata); } diff --git a/tests/Symfony/Tests/Component/Validator/Mapping/Loader/constraint-mapping.xml b/tests/Symfony/Tests/Component/Validator/Mapping/Loader/constraint-mapping.xml index cd669e51f4..7c1eeeeb32 100644 --- a/tests/Symfony/Tests/Component/Validator/Mapping/Loader/constraint-mapping.xml +++ b/tests/Symfony/Tests/Component/Validator/Mapping/Loader/constraint-mapping.xml @@ -9,7 +9,7 @@ - + diff --git a/tests/Symfony/Tests/Component/Validator/Mapping/Loader/constraint-mapping.yml b/tests/Symfony/Tests/Component/Validator/Mapping/Loader/constraint-mapping.yml index 0d0083ae59..1ea139b153 100644 --- a/tests/Symfony/Tests/Component/Validator/Mapping/Loader/constraint-mapping.yml +++ b/tests/Symfony/Tests/Component/Validator/Mapping/Loader/constraint-mapping.yml @@ -2,7 +2,7 @@ namespaces: custom: Symfony\Tests\Component\Validator\Fixtures\ Symfony\Tests\Component\Validator\Fixtures\Entity: - group_sequence_provider: Symfony\Tests\Component\Validator\Fixtures\GroupSequenceProvider + group_sequence_provider: true constraints: # Custom constraint - Symfony\Tests\Component\Validator\Fixtures\ConstraintA: ~ diff --git a/tests/Symfony/Tests/Component/Validator/ValidatorTest.php b/tests/Symfony/Tests/Component/Validator/ValidatorTest.php index 722f31472e..3726761571 100644 --- a/tests/Symfony/Tests/Component/Validator/ValidatorTest.php +++ b/tests/Symfony/Tests/Component/Validator/ValidatorTest.php @@ -19,7 +19,6 @@ require_once __DIR__.'/Fixtures/FakeClassMetadataFactory.php'; use Symfony\Tests\Component\Validator\Fixtures\Entity; use Symfony\Tests\Component\Validator\Fixtures\FakeClassMetadataFactory; use Symfony\Tests\Component\Validator\Fixtures\FailingConstraint; -use Symfony\Tests\Component\Validator\Fixtures\GroupSequenceProvider; use Symfony\Component\Validator\Validator; use Symfony\Component\Validator\ConstraintViolation; use Symfony\Component\Validator\ConstraintViolationList; @@ -125,8 +124,6 @@ class ValidatorTest extends \PHPUnit_Framework_TestCase public function testValidate_groupSequenceProvider() { - $groupSequenceProvider = new GroupSequenceProvider; - $entity = new Entity(); $metadata = new ClassMetadata(get_class($entity)); $metadata->addPropertyConstraint('firstName', new FailingConstraint(array( @@ -135,7 +132,7 @@ class ValidatorTest extends \PHPUnit_Framework_TestCase $metadata->addPropertyConstraint('lastName', new FailingConstraint(array( 'groups' => 'Second', ))); - $metadata->setGroupSequenceProvider($groupSequenceProvider); + $metadata->setGroupSequenceProvider(true); $this->factory->addClassMetadata($metadata); $violations = new ConstraintViolationList(); @@ -147,7 +144,7 @@ class ValidatorTest extends \PHPUnit_Framework_TestCase '' )); - $groupSequenceProvider->setGroups(array('First')); + $entity->setGroups(array('First')); $result = $this->validator->validate($entity); $this->assertEquals($violations, $result); @@ -160,11 +157,11 @@ class ValidatorTest extends \PHPUnit_Framework_TestCase '' )); - $groupSequenceProvider->setGroups(array('Second')); + $entity->setGroups(array('Second')); $result = $this->validator->validate($entity); $this->assertEquals($violations, $result); - $groupSequenceProvider->setGroups(array()); + $entity->setGroups(array()); $result = $this->validator->validate($entity); $this->assertEquals(new ConstraintViolationList(), $result); } From e0d28284fc6f46b5b1b1aa33d39497be2391ba24 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20H=C3=B6rl?= Date: Mon, 30 Jan 2012 23:51:45 +0100 Subject: [PATCH 3/7] [Validator] GroupSequenceProvider tests improved, configuration changed --- .../Constraints/GroupSequenceProvider.php | 9 ----- .../Validator/Mapping/ClassMetadata.php | 2 +- .../Mapping/Loader/AnnotationLoader.php | 2 +- .../Mapping/Loader/XmlFileLoader.php | 2 +- .../constraint-mapping-1.0.xsd | 1 - .../Component/Validator/Fixtures/Entity.php | 13 +------- .../Fixtures/GroupSequenceProviderEntity.php | 27 +++++++++++++++ .../Validator/Mapping/ClassMetadataTest.php | 33 +++++++++++++++++-- .../Mapping/Loader/AnnotationLoaderTest.php | 15 +++++++-- .../Mapping/Loader/XmlFileLoaderTest.php | 12 +++++++ .../Mapping/Loader/YamlFileLoaderTest.php | 12 +++++++ .../Mapping/Loader/constraint-mapping.xml | 10 ++++-- .../Mapping/Loader/constraint-mapping.yml | 4 ++- .../Component/Validator/ValidatorTest.php | 3 +- 14 files changed, 110 insertions(+), 35 deletions(-) create mode 100644 tests/Symfony/Tests/Component/Validator/Fixtures/GroupSequenceProviderEntity.php diff --git a/src/Symfony/Component/Validator/Constraints/GroupSequenceProvider.php b/src/Symfony/Component/Validator/Constraints/GroupSequenceProvider.php index c6650842d7..457155981a 100644 --- a/src/Symfony/Component/Validator/Constraints/GroupSequenceProvider.php +++ b/src/Symfony/Component/Validator/Constraints/GroupSequenceProvider.php @@ -18,14 +18,5 @@ namespace Symfony\Component\Validator\Constraints; */ class GroupSequenceProvider { - /** - * True if the group sequence provider should be used - * @var boolean - */ - public $active; - public function __construct(array $options) - { - $this->active = (bool)$options['value']; - } } diff --git a/src/Symfony/Component/Validator/Mapping/ClassMetadata.php b/src/Symfony/Component/Validator/Mapping/ClassMetadata.php index a59092ba7f..5c258dd2e4 100644 --- a/src/Symfony/Component/Validator/Mapping/ClassMetadata.php +++ b/src/Symfony/Component/Validator/Mapping/ClassMetadata.php @@ -307,7 +307,7 @@ class ClassMetadata extends ElementMetadata */ public function setGroupSequenceProvider($active) { - if ($this->hasGroupSequenceProvider()) { + if ($this->hasGroupSequence()) { throw new GroupDefinitionException('Defining a group sequence provider is not allowed with a static group sequence'); } diff --git a/src/Symfony/Component/Validator/Mapping/Loader/AnnotationLoader.php b/src/Symfony/Component/Validator/Mapping/Loader/AnnotationLoader.php index b67c9d7bcd..30642a0474 100644 --- a/src/Symfony/Component/Validator/Mapping/Loader/AnnotationLoader.php +++ b/src/Symfony/Component/Validator/Mapping/Loader/AnnotationLoader.php @@ -40,7 +40,7 @@ class AnnotationLoader implements LoaderInterface if ($constraint instanceof GroupSequence) { $metadata->setGroupSequence($constraint->groups); } elseif ($constraint instanceof GroupSequenceProvider) { - $metadata->setGroupSequenceProvider($constraint->active); + $metadata->setGroupSequenceProvider(true); } elseif ($constraint instanceof Constraint) { $metadata->addConstraint($constraint); } diff --git a/src/Symfony/Component/Validator/Mapping/Loader/XmlFileLoader.php b/src/Symfony/Component/Validator/Mapping/Loader/XmlFileLoader.php index 0e3bedeaca..4c185c604d 100644 --- a/src/Symfony/Component/Validator/Mapping/Loader/XmlFileLoader.php +++ b/src/Symfony/Component/Validator/Mapping/Loader/XmlFileLoader.php @@ -44,7 +44,7 @@ class XmlFileLoader extends FileLoader $xml = $this->classes[$metadata->getClassName()]; foreach ($xml->{'group-sequence-provider'} as $provider) { - $metadata->setGroupSequenceProvider((bool)$provider['active']); + $metadata->setGroupSequenceProvider(true); } foreach ($this->parseConstraints($xml->constraint) as $constraint) { diff --git a/src/Symfony/Component/Validator/Mapping/Loader/schema/dic/constraint-mapping/constraint-mapping-1.0.xsd b/src/Symfony/Component/Validator/Mapping/Loader/schema/dic/constraint-mapping/constraint-mapping-1.0.xsd index 60a91be73e..6d5d3b5f95 100644 --- a/src/Symfony/Component/Validator/Mapping/Loader/schema/dic/constraint-mapping/constraint-mapping-1.0.xsd +++ b/src/Symfony/Component/Validator/Mapping/Loader/schema/dic/constraint-mapping/constraint-mapping-1.0.xsd @@ -66,7 +66,6 @@ Defines the name of the group sequence provider for a class. ]]> - diff --git a/tests/Symfony/Tests/Component/Validator/Fixtures/Entity.php b/tests/Symfony/Tests/Component/Validator/Fixtures/Entity.php index 62aaa15ea4..e6c6316930 100644 --- a/tests/Symfony/Tests/Component/Validator/Fixtures/Entity.php +++ b/tests/Symfony/Tests/Component/Validator/Fixtures/Entity.php @@ -11,9 +11,8 @@ use Symfony\Component\Validator\GroupSequenceProviderInterface; /** * @Symfony\Tests\Component\Validator\Fixtures\ConstraintA * @Assert\GroupSequence({"Foo", "Entity"}) - * @Assert\GroupSequenceProvider("Symfony\Tests\Component\Validator\Fixtures\GroupSequenceProvider") */ -class Entity extends EntityParent implements EntityInterface, GroupSequenceProviderInterface +class Entity extends EntityParent implements EntityInterface { /** * @Assert\NotNull @@ -51,14 +50,4 @@ class Entity extends EntityParent implements EntityInterface, GroupSequenceProvi { return $this->lastName; } - - public function setGroups($groups) - { - $this->groups = $groups; - } - - public function getValidationGroups() - { - return $this->groups; - } } diff --git a/tests/Symfony/Tests/Component/Validator/Fixtures/GroupSequenceProviderEntity.php b/tests/Symfony/Tests/Component/Validator/Fixtures/GroupSequenceProviderEntity.php new file mode 100644 index 0000000000..9516c476d3 --- /dev/null +++ b/tests/Symfony/Tests/Component/Validator/Fixtures/GroupSequenceProviderEntity.php @@ -0,0 +1,27 @@ +groups = $groups; + } + + public function getValidationGroups() + { + return $this->groups; + } +} diff --git a/tests/Symfony/Tests/Component/Validator/Mapping/ClassMetadataTest.php b/tests/Symfony/Tests/Component/Validator/Mapping/ClassMetadataTest.php index 646c06e08a..a3f68f8f30 100644 --- a/tests/Symfony/Tests/Component/Validator/Mapping/ClassMetadataTest.php +++ b/tests/Symfony/Tests/Component/Validator/Mapping/ClassMetadataTest.php @@ -30,6 +30,7 @@ class ClassMetadataTest extends \PHPUnit_Framework_TestCase { const CLASSNAME = 'Symfony\Tests\Component\Validator\Fixtures\Entity'; const PARENTCLASS = 'Symfony\Tests\Component\Validator\Fixtures\EntityParent'; + const PROVIDERCLASS = 'Symfony\Tests\Component\Validator\Fixtures\GroupSequenceProviderEntity'; protected $metadata; @@ -192,7 +193,29 @@ class ClassMetadataTest extends \PHPUnit_Framework_TestCase $this->metadata->setGroupSequence(array('Foo', $this->metadata->getDefaultGroup(), Constraint::DEFAULT_GROUP)); } - public function testGroupSequenceProvider() + public function testGroupSequenceFailesIfGroupSequenceProviderIsSet() + { + $metadata = new ClassMetadata(self::PROVIDERCLASS); + $metadata->setGroupSequenceProvider(true); + + try { + $metadata->setGroupSequence(array('GroupSequenceProviderEntity', 'Foo')); + $this->fail(); + } catch(GroupDefinitionException $e) {} + } + + public function testGroupSequenceProviderFailesIfGroupSequenceIsSet() + { + $metadata = new ClassMetadata(self::PROVIDERCLASS); + $metadata->setGroupSequence(array('GroupSequenceProviderEntity', 'Foo')); + + try { + $metadata->setGroupSequenceProvider(true); + $this->fail(); + } catch(GroupDefinitionException $e) {} + } + + public function testGroupSequenceProviderFailesIfDomainClassIsInvalid() { $metadata = new ClassMetadata('stdClass'); @@ -200,8 +223,12 @@ class ClassMetadataTest extends \PHPUnit_Framework_TestCase $metadata->setGroupSequenceProvider(true); $this->fail(); } catch(GroupDefinitionException $e) {} + } - $this->metadata->setGroupSequenceProvider(true); - $this->assertTrue($this->metadata->hasGroupSequenceProvider()); + public function testGroupSequenceProvider() + { + $metadata = new ClassMetadata(self::PROVIDERCLASS); + $metadata->setGroupSequenceProvider(true); + $this->assertTrue($metadata->hasGroupSequenceProvider()); } } diff --git a/tests/Symfony/Tests/Component/Validator/Mapping/Loader/AnnotationLoaderTest.php b/tests/Symfony/Tests/Component/Validator/Mapping/Loader/AnnotationLoaderTest.php index cf9f30669f..2a6e5dbf54 100644 --- a/tests/Symfony/Tests/Component/Validator/Mapping/Loader/AnnotationLoaderTest.php +++ b/tests/Symfony/Tests/Component/Validator/Mapping/Loader/AnnotationLoaderTest.php @@ -73,7 +73,6 @@ class AnnotationLoaderTest extends \PHPUnit_Framework_TestCase 'choices' => array('A', 'B'), ))); $expected->addGetterConstraint('lastName', new NotNull()); - $expected->setGroupSequenceProvider(true); // load reflection class so that the comparison passes $expected->getReflectionClass(); @@ -138,7 +137,6 @@ class AnnotationLoaderTest extends \PHPUnit_Framework_TestCase 'choices' => array('A', 'B'), ))); $expected->addGetterConstraint('lastName', new NotNull()); - $expected->setGroupSequenceProvider(true); // load reflection class so that the comparison passes $expected->getReflectionClass(); @@ -146,4 +144,17 @@ class AnnotationLoaderTest extends \PHPUnit_Framework_TestCase $this->assertEquals($expected, $metadata); } + public function testLoadGroupSequenceProviderAnnotation() + { + $loader = new AnnotationLoader(new AnnotationReader()); + + $metadata = new ClassMetadata('Symfony\Tests\Component\Validator\Fixtures\GroupSequenceProviderEntity'); + $loader->loadClassMetadata($metadata); + + $expected = new ClassMetadata('Symfony\Tests\Component\Validator\Fixtures\GroupSequenceProviderEntity'); + $expected->setGroupSequenceProvider(true); + $expected->getReflectionClass(); + + $this->assertEquals($expected, $metadata); + } } diff --git a/tests/Symfony/Tests/Component/Validator/Mapping/Loader/XmlFileLoaderTest.php b/tests/Symfony/Tests/Component/Validator/Mapping/Loader/XmlFileLoaderTest.php index 5aa47b001e..8afae6c1ef 100644 --- a/tests/Symfony/Tests/Component/Validator/Mapping/Loader/XmlFileLoaderTest.php +++ b/tests/Symfony/Tests/Component/Validator/Mapping/Loader/XmlFileLoaderTest.php @@ -67,6 +67,18 @@ class XmlFileLoaderTest extends \PHPUnit_Framework_TestCase 'choices' => array('A', 'B'), ))); $expected->addGetterConstraint('lastName', new NotNull()); + + $this->assertEquals($expected, $metadata); + } + + public function testLoadGroupSequenceProvider() + { + $loader = new XmlFileLoader(__DIR__.'/constraint-mapping.xml'); + $metadata = new ClassMetadata('Symfony\Tests\Component\Validator\Fixtures\GroupSequenceProviderEntity'); + + $loader->loadClassMetadata($metadata); + + $expected = new ClassMetadata('Symfony\Tests\Component\Validator\Fixtures\GroupSequenceProviderEntity'); $expected->setGroupSequenceProvider(true); $this->assertEquals($expected, $metadata); diff --git a/tests/Symfony/Tests/Component/Validator/Mapping/Loader/YamlFileLoaderTest.php b/tests/Symfony/Tests/Component/Validator/Mapping/Loader/YamlFileLoaderTest.php index a1d54e5b9c..2d1d458efe 100644 --- a/tests/Symfony/Tests/Component/Validator/Mapping/Loader/YamlFileLoaderTest.php +++ b/tests/Symfony/Tests/Component/Validator/Mapping/Loader/YamlFileLoaderTest.php @@ -85,6 +85,18 @@ class YamlFileLoaderTest extends \PHPUnit_Framework_TestCase 'choices' => array('A', 'B'), ))); $expected->addGetterConstraint('lastName', new NotNull()); + + $this->assertEquals($expected, $metadata); + } + + public function testLoadGroupSequenceProvider() + { + $loader = new YamlFileLoader(__DIR__.'/constraint-mapping.yml'); + $metadata = new ClassMetadata('Symfony\Tests\Component\Validator\Fixtures\GroupSequenceProviderEntity'); + + $loader->loadClassMetadata($metadata); + + $expected = new ClassMetadata('Symfony\Tests\Component\Validator\Fixtures\GroupSequenceProviderEntity'); $expected->setGroupSequenceProvider(true); $this->assertEquals($expected, $metadata); diff --git a/tests/Symfony/Tests/Component/Validator/Mapping/Loader/constraint-mapping.xml b/tests/Symfony/Tests/Component/Validator/Mapping/Loader/constraint-mapping.xml index 7c1eeeeb32..916394b1bd 100644 --- a/tests/Symfony/Tests/Component/Validator/Mapping/Loader/constraint-mapping.xml +++ b/tests/Symfony/Tests/Component/Validator/Mapping/Loader/constraint-mapping.xml @@ -8,9 +8,6 @@ - - - @@ -80,4 +77,11 @@ + + + + + + + diff --git a/tests/Symfony/Tests/Component/Validator/Mapping/Loader/constraint-mapping.yml b/tests/Symfony/Tests/Component/Validator/Mapping/Loader/constraint-mapping.yml index 1ea139b153..cd4b9355e1 100644 --- a/tests/Symfony/Tests/Component/Validator/Mapping/Loader/constraint-mapping.yml +++ b/tests/Symfony/Tests/Component/Validator/Mapping/Loader/constraint-mapping.yml @@ -2,7 +2,6 @@ namespaces: custom: Symfony\Tests\Component\Validator\Fixtures\ Symfony\Tests\Component\Validator\Fixtures\Entity: - group_sequence_provider: true constraints: # Custom constraint - Symfony\Tests\Component\Validator\Fixtures\ConstraintA: ~ @@ -40,3 +39,6 @@ Symfony\Tests\Component\Validator\Fixtures\Entity: getters: lastName: - NotNull: ~ + +Symfony\Tests\Component\Validator\Fixtures\GroupSequenceProviderEntity: + group_sequence_provider: true diff --git a/tests/Symfony/Tests/Component/Validator/ValidatorTest.php b/tests/Symfony/Tests/Component/Validator/ValidatorTest.php index 3726761571..a9fdc267e0 100644 --- a/tests/Symfony/Tests/Component/Validator/ValidatorTest.php +++ b/tests/Symfony/Tests/Component/Validator/ValidatorTest.php @@ -17,6 +17,7 @@ require_once __DIR__.'/Fixtures/FailingConstraintValidator.php'; require_once __DIR__.'/Fixtures/FakeClassMetadataFactory.php'; use Symfony\Tests\Component\Validator\Fixtures\Entity; +use Symfony\Tests\Component\Validator\Fixtures\GroupSequenceProviderEntity; use Symfony\Tests\Component\Validator\Fixtures\FakeClassMetadataFactory; use Symfony\Tests\Component\Validator\Fixtures\FailingConstraint; use Symfony\Component\Validator\Validator; @@ -124,7 +125,7 @@ class ValidatorTest extends \PHPUnit_Framework_TestCase public function testValidate_groupSequenceProvider() { - $entity = new Entity(); + $entity = new GroupSequenceProviderEntity(); $metadata = new ClassMetadata(get_class($entity)); $metadata->addPropertyConstraint('firstName', new FailingConstraint(array( 'groups' => 'First', From 9f2310b2f84f38134faf791c40aaa4131a28ebd0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20H=C3=B6rl?= Date: Thu, 2 Feb 2012 15:59:37 +0100 Subject: [PATCH 4/7] [Validator] Fixed typos, renamed hasGroupSequenceProvider --- .../Component/Validator/GraphWalker.php | 3 +- .../Validator/Mapping/ClassMetadata.php | 6 ++-- .../Component/Validator/Fixtures/Entity.php | 3 -- .../Validator/Mapping/ClassMetadataTest.php | 35 +++++++++---------- 4 files changed, 20 insertions(+), 27 deletions(-) diff --git a/src/Symfony/Component/Validator/GraphWalker.php b/src/Symfony/Component/Validator/GraphWalker.php index 489605b1d1..f06d10b9fe 100644 --- a/src/Symfony/Component/Validator/GraphWalker.php +++ b/src/Symfony/Component/Validator/GraphWalker.php @@ -68,8 +68,7 @@ class GraphWalker $initializer->initialize($object); } - if ($group === Constraint::DEFAULT_GROUP && ($metadata->hasGroupSequence() || $metadata->hasGroupSequenceProvider())) { - + if ($group === Constraint::DEFAULT_GROUP && ($metadata->hasGroupSequence() || $metadata->isGroupSequenceProvider())) { if ($metadata->hasGroupSequence()) { $groups = $metadata->getGroupSequence(); } else { diff --git a/src/Symfony/Component/Validator/Mapping/ClassMetadata.php b/src/Symfony/Component/Validator/Mapping/ClassMetadata.php index 5c258dd2e4..2d8c60f098 100644 --- a/src/Symfony/Component/Validator/Mapping/ClassMetadata.php +++ b/src/Symfony/Component/Validator/Mapping/ClassMetadata.php @@ -249,7 +249,7 @@ class ClassMetadata extends ElementMetadata */ public function setGroupSequence(array $groups) { - if ($this->hasGroupSequenceProvider()) { + if ($this->isGroupSequenceProvider()) { throw new GroupDefinitionException('Defining a static group sequence is not allowed with a group sequence provider'); } @@ -319,11 +319,11 @@ class ClassMetadata extends ElementMetadata } /** - * Returns whether the class has a group sequence provider. + * Returns whether the class is a group sequence provider. * * @return boolean */ - public function hasGroupSequenceProvider() + public function isGroupSequenceProvider() { return $this->groupSequenceProvider; } diff --git a/tests/Symfony/Tests/Component/Validator/Fixtures/Entity.php b/tests/Symfony/Tests/Component/Validator/Fixtures/Entity.php index e6c6316930..781e41af70 100644 --- a/tests/Symfony/Tests/Component/Validator/Fixtures/Entity.php +++ b/tests/Symfony/Tests/Component/Validator/Fixtures/Entity.php @@ -6,7 +6,6 @@ require_once __DIR__.'/EntityParent.php'; require_once __DIR__.'/EntityInterface.php'; use Symfony\Component\Validator\Constraints as Assert; -use Symfony\Component\Validator\GroupSequenceProviderInterface; /** * @Symfony\Tests\Component\Validator\Fixtures\ConstraintA @@ -29,8 +28,6 @@ class Entity extends EntityParent implements EntityInterface protected $lastName; public $reference; - protected $groups = array(); - private $internal; public function __construct($internal = null) diff --git a/tests/Symfony/Tests/Component/Validator/Mapping/ClassMetadataTest.php b/tests/Symfony/Tests/Component/Validator/Mapping/ClassMetadataTest.php index a3f68f8f30..7da676aba8 100644 --- a/tests/Symfony/Tests/Component/Validator/Mapping/ClassMetadataTest.php +++ b/tests/Symfony/Tests/Component/Validator/Mapping/ClassMetadataTest.php @@ -193,42 +193,39 @@ class ClassMetadataTest extends \PHPUnit_Framework_TestCase $this->metadata->setGroupSequence(array('Foo', $this->metadata->getDefaultGroup(), Constraint::DEFAULT_GROUP)); } - public function testGroupSequenceFailesIfGroupSequenceProviderIsSet() + /** + * @expectedException Symfony\Component\Validator\Exception\GroupDefinitionException + */ + public function testGroupSequenceFailsIfGroupSequenceProviderIsSet() { $metadata = new ClassMetadata(self::PROVIDERCLASS); $metadata->setGroupSequenceProvider(true); - - try { - $metadata->setGroupSequence(array('GroupSequenceProviderEntity', 'Foo')); - $this->fail(); - } catch(GroupDefinitionException $e) {} + $metadata->setGroupSequence(array('GroupSequenceProviderEntity', 'Foo')); } - public function testGroupSequenceProviderFailesIfGroupSequenceIsSet() + /** + * @expectedException Symfony\Component\Validator\Exception\GroupDefinitionException + */ + public function testGroupSequenceProviderFailsIfGroupSequenceIsSet() { $metadata = new ClassMetadata(self::PROVIDERCLASS); $metadata->setGroupSequence(array('GroupSequenceProviderEntity', 'Foo')); - - try { - $metadata->setGroupSequenceProvider(true); - $this->fail(); - } catch(GroupDefinitionException $e) {} + $metadata->setGroupSequenceProvider(true); } - public function testGroupSequenceProviderFailesIfDomainClassIsInvalid() + /** + * @expectedException Symfony\Component\Validator\Exception\GroupDefinitionException + */ + public function testGroupSequenceProviderFailsIfDomainClassIsInvalid() { $metadata = new ClassMetadata('stdClass'); - - try { - $metadata->setGroupSequenceProvider(true); - $this->fail(); - } catch(GroupDefinitionException $e) {} + $metadata->setGroupSequenceProvider(true); } public function testGroupSequenceProvider() { $metadata = new ClassMetadata(self::PROVIDERCLASS); $metadata->setGroupSequenceProvider(true); - $this->assertTrue($metadata->hasGroupSequenceProvider()); + $this->assertTrue($metadata->isGroupSequenceProvider()); } } From d84a2e4bdfe8904658791e1af4f4461a21bf34dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20H=C3=B6rl?= Date: Thu, 2 Feb 2012 16:18:23 +0100 Subject: [PATCH 5/7] [Validator] Updated test expectations --- tests/Symfony/Tests/Component/Validator/ValidatorTest.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/Symfony/Tests/Component/Validator/ValidatorTest.php b/tests/Symfony/Tests/Component/Validator/ValidatorTest.php index a9fdc267e0..19c3f7647d 100644 --- a/tests/Symfony/Tests/Component/Validator/ValidatorTest.php +++ b/tests/Symfony/Tests/Component/Validator/ValidatorTest.php @@ -138,7 +138,7 @@ class ValidatorTest extends \PHPUnit_Framework_TestCase $violations = new ConstraintViolationList(); $violations->add(new ConstraintViolation( - '', + 'Failed', array(), $entity, 'firstName', @@ -151,7 +151,7 @@ class ValidatorTest extends \PHPUnit_Framework_TestCase $violations = new ConstraintViolationList(); $violations->add(new ConstraintViolation( - '', + 'Failed', array(), $entity, 'lastName', From 815c769292647bd387d2e583523705acb72af026 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20H=C3=B6rl?= Date: Thu, 2 Feb 2012 20:27:06 +0100 Subject: [PATCH 6/7] [Validator] Renamed getValidationGroups to getGroupSequence --- src/Symfony/Component/Validator/GraphWalker.php | 2 +- .../Component/Validator/GroupSequenceProviderInterface.php | 2 +- .../Validator/Fixtures/GroupSequenceProviderEntity.php | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Symfony/Component/Validator/GraphWalker.php b/src/Symfony/Component/Validator/GraphWalker.php index f06d10b9fe..0f4b99e634 100644 --- a/src/Symfony/Component/Validator/GraphWalker.php +++ b/src/Symfony/Component/Validator/GraphWalker.php @@ -72,7 +72,7 @@ class GraphWalker if ($metadata->hasGroupSequence()) { $groups = $metadata->getGroupSequence(); } else { - $groups = $object->getValidationGroups(); + $groups = $object->getGroupSequence(); } foreach ($groups as $group) { diff --git a/src/Symfony/Component/Validator/GroupSequenceProviderInterface.php b/src/Symfony/Component/Validator/GroupSequenceProviderInterface.php index 0265691a6d..676a3b399f 100644 --- a/src/Symfony/Component/Validator/GroupSequenceProviderInterface.php +++ b/src/Symfony/Component/Validator/GroupSequenceProviderInterface.php @@ -22,5 +22,5 @@ interface GroupSequenceProviderInterface * * @return array An array of validation groups */ - function getValidationGroups(); + function getGroupSequence(); } diff --git a/tests/Symfony/Tests/Component/Validator/Fixtures/GroupSequenceProviderEntity.php b/tests/Symfony/Tests/Component/Validator/Fixtures/GroupSequenceProviderEntity.php index 9516c476d3..9b1afefd08 100644 --- a/tests/Symfony/Tests/Component/Validator/Fixtures/GroupSequenceProviderEntity.php +++ b/tests/Symfony/Tests/Component/Validator/Fixtures/GroupSequenceProviderEntity.php @@ -20,7 +20,7 @@ class GroupSequenceProviderEntity implements GroupSequenceProviderInterface $this->groups = $groups; } - public function getValidationGroups() + public function getGroupSequence() { return $this->groups; } From 411a0ccbdd02a146bc3fe9ac414dee27b05ee122 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20H=C3=B6rl?= Date: Fri, 3 Feb 2012 17:45:10 +0100 Subject: [PATCH 7/7] [Validator] Added GroupSequenceProvider to changelog --- CHANGELOG-2.1.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG-2.1.md b/CHANGELOG-2.1.md index d72a196779..5177b1e8aa 100644 --- a/CHANGELOG-2.1.md +++ b/CHANGELOG-2.1.md @@ -299,6 +299,7 @@ To get the diff between two versions, go to https://github.com/symfony/symfony/c * made ExecutionContext immutable * deprecated Constraint methods `setMessage`, `getMessageTemplate` and `getMessageParameters` + * added support for dynamic group sequences with the GroupSequenceProvider pattern ### Yaml