Chris@0: Chris@0: * Chris@0: * For the full copyright and license information, please view the LICENSE Chris@0: * file that was distributed with this source code. Chris@0: */ Chris@0: Chris@0: namespace Symfony\Component\Validator\Mapping\Loader; Chris@0: Chris@0: use Doctrine\Common\Annotations\Reader; Chris@0: use Symfony\Component\Validator\Constraint; Chris@0: use Symfony\Component\Validator\Constraints\Callback; Chris@0: use Symfony\Component\Validator\Constraints\GroupSequence; Chris@0: use Symfony\Component\Validator\Constraints\GroupSequenceProvider; Chris@0: use Symfony\Component\Validator\Exception\MappingException; Chris@0: use Symfony\Component\Validator\Mapping\ClassMetadata; Chris@0: Chris@0: /** Chris@0: * Loads validation metadata using a Doctrine annotation {@link Reader}. Chris@0: * Chris@0: * @author Bernhard Schussek Chris@0: */ Chris@0: class AnnotationLoader implements LoaderInterface Chris@0: { Chris@0: protected $reader; Chris@0: Chris@0: public function __construct(Reader $reader) Chris@0: { Chris@0: $this->reader = $reader; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function loadClassMetadata(ClassMetadata $metadata) Chris@0: { Chris@0: $reflClass = $metadata->getReflectionClass(); Chris@0: $className = $reflClass->name; Chris@0: $success = false; Chris@0: Chris@0: foreach ($this->reader->getClassAnnotations($reflClass) as $constraint) { Chris@0: if ($constraint instanceof GroupSequence) { Chris@0: $metadata->setGroupSequence($constraint->groups); Chris@0: } elseif ($constraint instanceof GroupSequenceProvider) { Chris@0: $metadata->setGroupSequenceProvider(true); Chris@0: } elseif ($constraint instanceof Constraint) { Chris@0: $metadata->addConstraint($constraint); Chris@0: } Chris@0: Chris@0: $success = true; Chris@0: } Chris@0: Chris@0: foreach ($reflClass->getProperties() as $property) { Chris@0: if ($property->getDeclaringClass()->name === $className) { Chris@0: foreach ($this->reader->getPropertyAnnotations($property) as $constraint) { Chris@0: if ($constraint instanceof Constraint) { Chris@0: $metadata->addPropertyConstraint($property->name, $constraint); Chris@0: } Chris@0: Chris@0: $success = true; Chris@0: } Chris@0: } Chris@0: } Chris@0: Chris@0: foreach ($reflClass->getMethods() as $method) { Chris@0: if ($method->getDeclaringClass()->name === $className) { Chris@0: foreach ($this->reader->getMethodAnnotations($method) as $constraint) { Chris@0: if ($constraint instanceof Callback) { Chris@0: $constraint->callback = $method->getName(); Chris@0: Chris@0: $metadata->addConstraint($constraint); Chris@0: } elseif ($constraint instanceof Constraint) { Chris@0: if (preg_match('/^(get|is|has)(.+)$/i', $method->name, $matches)) { Chris@0: $metadata->addGetterMethodConstraint(lcfirst($matches[2]), $matches[0], $constraint); Chris@0: } else { Chris@0: throw new MappingException(sprintf('The constraint on "%s::%s" cannot be added. Constraints can only be added on methods beginning with "get", "is" or "has".', $className, $method->name)); Chris@0: } Chris@0: } Chris@0: Chris@0: $success = true; Chris@0: } Chris@0: } Chris@0: } Chris@0: Chris@0: return $success; Chris@0: } Chris@0: }