diff --git a/Validator/Constraints/UniqueObject.php b/Validator/Constraints/UniqueObject.php index 77a37c56..0626e4b9 100644 --- a/Validator/Constraints/UniqueObject.php +++ b/Validator/Constraints/UniqueObject.php @@ -1,5 +1,4 @@ + * @author Marek Kalnik */ class UniqueObject extends Constraint { /** - * @var array + * @var string */ - public $fields = array(); + public $message = 'A {{ object_class }} object already exists with {{ fields }}'; /** - * @return array + * @var string Used to merge multiple fields in the message */ - public function getRequiredOptions() - { - return array('fields'); - } + public $messageFieldSeparator = ' and '; /** - * The validator must be defined as a service with this name. - * - * @return string + * @var array */ - public function validatedBy() - { - return get_class($this).'Validator'; - } + public $fields = array(); - /** - * {@inheritDoc} - */ - public function getTargets() + public function __construct($options = null) { - return self::CLASS_CONSTRAINT; + parent::__construct($options); + + if (!is_array($this->fields) && !is_string($this->fields)) { + throw new UnexpectedTypeException($this->fields, 'array'); + } + + if (0 === count($this->fields)) { + throw new ConstraintDefinitionException("At least one field must be specified."); + } } /** - * @return string + * {@inheritDoc} */ - public function getDefaultOption() + public function getRequiredOptions() { - return 'fields'; + return array('fields'); } /** - * @return string + * {@inheritDoc} */ - public function getMessage() + public function getTargets() { - return 'A ' . $this->groups[1] . ' object already exists'; + return self::CLASS_CONSTRAINT; } } diff --git a/Validator/Constraints/UniqueObjectValidator.php b/Validator/Constraints/UniqueObjectValidator.php index 54df89d4..7b08e23e 100644 --- a/Validator/Constraints/UniqueObjectValidator.php +++ b/Validator/Constraints/UniqueObjectValidator.php @@ -1,5 +1,4 @@ + * @author Marek Kalnik */ class UniqueObjectValidator extends ConstraintValidator { /** - * @param object $object - * @param \Symfony\Component\Validator\Constraint $constraint - * @return Boolean + * {@inheritdoc} */ - public function isValid($object, Constraint $constraint) + public function validate($object, Constraint $constraint) { - if (!is_array($constraint->fields) && !is_string($constraint->fields)) { - throw new UnexpectedTypeException($constraint->fields, 'array'); - } - - $fields = (array)$constraint->fields; - - if (0 === count($fields)) { - throw new ConstraintDefinitionException("At least one field must be specified."); - } + $fields = (array) $constraint->fields; $class = get_class($object); $peerClass = $class . 'Peer'; @@ -52,26 +41,33 @@ public function isValid($object, Constraint $constraint) $bddUsersQuery = $queryClass::create(); foreach ($fields as $fieldName) { - $bddUsersQuery->filterBy($peerClass::translateFieldName($fieldName, \BasePeer::TYPE_FIELDNAME, \BasePeer::TYPE_PHPNAME), $object->getByName($fieldName, \BasePeer::TYPE_FIELDNAME)); + $bddUsersQuery->filterBy( + $peerClass::translateFieldName($fieldName, \BasePeer::TYPE_FIELDNAME, \BasePeer::TYPE_PHPNAME), + $object->getByName($fieldName, \BasePeer::TYPE_FIELDNAME) + ); } $bddUsers = $bddUsersQuery->find(); $countUser = count($bddUsers); if ($countUser > 1 || ($countUser === 1 && $object !== $bddUsers[0])) { - $constraintMessage = $constraint->getMessage(); - $constraintMessage .= ' with'; + $fieldParts = array(); foreach ($fields as $fieldName) { - $constraintMessage .= sprintf(' %s "%s" and', $peerClass::translateFieldName($fieldName, \BasePeer::TYPE_FIELDNAME, \BasePeer::TYPE_PHPNAME), $object->getByName($fieldName, \BasePeer::TYPE_FIELDNAME)); + $fieldParts[] = sprintf( + '%s "%s"', + $peerClass::translateFieldName($fieldName, \BasePeer::TYPE_FIELDNAME, \BasePeer::TYPE_PHPNAME), + $object->getByName($fieldName, \BasePeer::TYPE_FIELDNAME) + ); } - $constraintMessage = substr($constraintMessage, 0, -4) . '.'; - $this->setMessage($constraintMessage); - - return false; + $this->context->addViolation( + $constraint->message, + array( + '{{ object_class }}' => $class, + '{{ fields }}' => implode($constraint->messageFieldSeparator, $fieldParts) + ) + ); } - - return true; } }