From cfc2471109c56fba3678894ab0762c13ab3d1ac5 Mon Sep 17 00:00:00 2001 From: Benjamin Eberlei Date: Tue, 17 May 2011 23:04:13 +0200 Subject: [PATCH] [Doctrine] Add Unique Validator --- .../Doctrine/Validator/UniqueEntity.php | 31 ++++++++++++ .../Validator/UniqueEntityValidator.php | 48 +++++++++++++++++++ .../Validator/ConstraintValidator.php | 9 ++++ 3 files changed, 88 insertions(+) create mode 100644 src/Symfony/Bridge/Doctrine/Validator/UniqueEntity.php create mode 100644 src/Symfony/Bridge/Doctrine/Validator/UniqueEntityValidator.php diff --git a/src/Symfony/Bridge/Doctrine/Validator/UniqueEntity.php b/src/Symfony/Bridge/Doctrine/Validator/UniqueEntity.php new file mode 100644 index 0000000000..6694322c97 --- /dev/null +++ b/src/Symfony/Bridge/Doctrine/Validator/UniqueEntity.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\Bridge\Doctrine\Validator; + +use Symfony\Component\Validator\Constraint; +use Symfony\Component\Validator\ConstraintValidator; +use Symfony\Component\Validator\Exception\UnexpectedTypeException; + +class UniqueEntity extends \Symfony\Component\Validator\Constraint +{ + public $message = 'This value is already used.'; + public $entityManagerName = false; + public $fields = array(); + + /** + * {@inheritDoc} + */ + public function getTargets() + { + return self::CLASS_CONSTRAINT; + } +} \ No newline at end of file diff --git a/src/Symfony/Bridge/Doctrine/Validator/UniqueEntityValidator.php b/src/Symfony/Bridge/Doctrine/Validator/UniqueEntityValidator.php new file mode 100644 index 0000000000..6e35f8121f --- /dev/null +++ b/src/Symfony/Bridge/Doctrine/Validator/UniqueEntityValidator.php @@ -0,0 +1,48 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Bridge\Doctrine\Validator; + +class UniqueEntityValidator extends ConstraintValidator +{ + /** + * @var Registry + */ + private $registry; + + public function __construct(Registry $registry) + { + $this->registry = $registry; + } + + public function isValid($entity, Constraint $constraint) + { + $emName = $constraint->entityManagerName ?: $this->registry->getDefaultConnectionName(); + $em = $this->registry->getEntityManager($emName); + + $className = $this->context->getCurrentClass(); + $class = $em->getClassMetadata($className); + + $criteria = array(); + foreach ($contraint->fields AS $fieldName) { + $criteria[$fieldName] = $class->reflFields[$fieldName]->getValue($entity); + } + + $repository = $em->getRepository($className); + $result = $repository->findBy($criteria); + + if (count($result) > 0 && $result[0] !== $entity) { + $this->setMessage($constraint->message); + return false; + } + return true; + } +} \ No newline at end of file diff --git a/src/Symfony/Component/Validator/ConstraintValidator.php b/src/Symfony/Component/Validator/ConstraintValidator.php index 37aa1749ab..4357c5a77f 100644 --- a/src/Symfony/Component/Validator/ConstraintValidator.php +++ b/src/Symfony/Component/Validator/ConstraintValidator.php @@ -13,8 +13,17 @@ namespace Symfony\Component\Validator; abstract class ConstraintValidator implements ConstraintValidatorInterface { + /** + * @var ExecutionContext + */ protected $context; + /** + * @var string + */ private $messageTemplate; + /** + * @var array + */ private $messageParameters; /**