diff --git a/src/Symfony/Component/Validator/Mapping/Loader/StaticMethodLoader.php b/src/Symfony/Component/Validator/Mapping/Loader/StaticMethodLoader.php index 673786752e..d8086b2b9c 100644 --- a/src/Symfony/Component/Validator/Mapping/Loader/StaticMethodLoader.php +++ b/src/Symfony/Component/Validator/Mapping/Loader/StaticMethodLoader.php @@ -31,9 +31,13 @@ class StaticMethodLoader implements LoaderInterface /** @var \ReflectionClass $reflClass */ $reflClass = $metadata->getReflectionClass(); - if (!$reflClass->isInterface() && !$reflClass->isAbstract() && $reflClass->hasMethod($this->methodName)) { + if (!$reflClass->isInterface() && $reflClass->hasMethod($this->methodName)) { $reflMethod = $reflClass->getMethod($this->methodName); + if ($reflMethod->isAbstract()) { + return false; + } + if (!$reflMethod->isStatic()) { throw new MappingException(sprintf('The method %s::%s should be static', $reflClass->name, $this->methodName)); } diff --git a/src/Symfony/Component/Validator/Tests/Mapping/Loader/AbstractMethodStaticLoader.php b/src/Symfony/Component/Validator/Tests/Mapping/Loader/AbstractMethodStaticLoader.php new file mode 100644 index 0000000000..3a1416cfc5 --- /dev/null +++ b/src/Symfony/Component/Validator/Tests/Mapping/Loader/AbstractMethodStaticLoader.php @@ -0,0 +1,10 @@ +assertCount(0, $metadata->getConstraints()); } - public function testLoadClassMetadataIgnoresAbstractClasses() + public function testLoadClassMetadataInAbstractClasses() { $loader = new StaticMethodLoader('loadMetadata'); $metadata = new ClassMetadata(__NAMESPACE__.'\AbstractStaticLoader'); $loader->loadClassMetadata($metadata); + $this->assertCount(1, $metadata->getConstraints()); + } + + public function testLoadClassMetadataIgnoresAbstractMethods() + { + $loader = new StaticMethodLoader('loadMetadata'); + try { + include __DIR__ . '/AbstractMethodStaticLoader.php'; + $this->fail('AbstractMethodStaticLoader should produce a strict standard error.'); + } catch (\Exception $e) { + } + + $metadata = new ClassMetadata(__NAMESPACE__.'\AbstractMethodStaticLoader'); + $loader->loadClassMetadata($metadata); + $this->assertCount(0, $metadata->getConstraints()); } } @@ -86,6 +101,7 @@ abstract class AbstractStaticLoader { public static function loadMetadata(ClassMetadata $metadata) { + $metadata->addConstraint(new ConstraintA()); } }