diff --git a/core/modules/comment/src/Plugin/Validation/Constraint/CommentNameConstraintValidator.php b/core/modules/comment/src/Plugin/Validation/Constraint/CommentNameConstraintValidator.php index 0bb45da8e48c..e47c371416dd 100644 --- a/core/modules/comment/src/Plugin/Validation/Constraint/CommentNameConstraintValidator.php +++ b/core/modules/comment/src/Plugin/Validation/Constraint/CommentNameConstraintValidator.php @@ -18,12 +18,12 @@ class CommentNameConstraintValidator extends ConstraintValidator { /** * {@inheritdoc} */ - public function validate($field_item, Constraint $constraint) { - $author_name = $field_item->value; + public function validate($items, Constraint $constraint) { + $author_name = $items->first()->value; if (isset($author_name) && $author_name !== '') { // Do not allow unauthenticated comment authors to use a name that is // taken by a registered user. - if ($field_item->getEntity()->getOwnerId() === 0) { + if ($items->getEntity()->getOwnerId() === 0) { // @todo Properly inject dependency https://drupal.org/node/2197029 $users = \Drupal::entityManager()->getStorage('user')->loadByProperties(array('name' => $author_name)); if (!empty($users)) { diff --git a/core/modules/user/src/Entity/User.php b/core/modules/user/src/Entity/User.php index 79bdd737640d..eb465862b0b3 100644 --- a/core/modules/user/src/Entity/User.php +++ b/core/modules/user/src/Entity/User.php @@ -472,7 +472,7 @@ class User extends ContentEntityBase implements UserInterface { ->setLabel(t('Name')) ->setDescription(t('The name of this user.')) ->setDefaultValue('') - ->setPropertyConstraints('value', array( + ->setConstraints(array( // No Length constraint here because the UserName constraint also covers // that. 'UserName' => array(), @@ -487,7 +487,7 @@ class User extends ContentEntityBase implements UserInterface { ->setLabel(t('Email')) ->setDescription(t('The email of this user.')) ->setDefaultValue('') - ->setPropertyConstraints('value', array('UserMailUnique' => array())); + ->setConstraints(array('UserMailUnique' => array())); // @todo Convert to a text field in https://drupal.org/node/1548204. $fields['signature'] = BaseFieldDefinition::create('string') diff --git a/core/modules/user/src/Plugin/Validation/Constraint/UserNameConstraint.php b/core/modules/user/src/Plugin/Validation/Constraint/UserNameConstraint.php index 8aba0cf15c1e..381d3cf13cc4 100644 --- a/core/modules/user/src/Plugin/Validation/Constraint/UserNameConstraint.php +++ b/core/modules/user/src/Plugin/Validation/Constraint/UserNameConstraint.php @@ -14,7 +14,7 @@ use Symfony\Component\Validator\Constraint; * * @Plugin( * id = "UserName", - * label = @Translation("User name", context = "Validation") + * label = @Translation("User name", context = "Validation"), * ) */ class UserNameConstraint extends Constraint { diff --git a/core/modules/user/src/Plugin/Validation/Constraint/UserNameConstraintValidator.php b/core/modules/user/src/Plugin/Validation/Constraint/UserNameConstraintValidator.php index ffd4d82017af..5b788ca7a2d4 100644 --- a/core/modules/user/src/Plugin/Validation/Constraint/UserNameConstraintValidator.php +++ b/core/modules/user/src/Plugin/Validation/Constraint/UserNameConstraintValidator.php @@ -18,11 +18,12 @@ class UserNameConstraintValidator extends ConstraintValidator { /** * {@inheritdoc} */ - public function validate($name, Constraint $constraint) { - if (!$name) { + public function validate($items, Constraint $constraint) { + if (!isset($items) || !$items->value) { $this->context->addViolation($constraint->emptyMessage); return; } + $name = $items->first()->value; if (substr($name, 0, 1) == ' ') { $this->context->addViolation($constraint->spaceBeginMessage); } diff --git a/core/modules/user/src/Plugin/Validation/Constraint/UserNameUnique.php b/core/modules/user/src/Plugin/Validation/Constraint/UserNameUnique.php index d05d5a64d386..3c146f06c8a4 100644 --- a/core/modules/user/src/Plugin/Validation/Constraint/UserNameUnique.php +++ b/core/modules/user/src/Plugin/Validation/Constraint/UserNameUnique.php @@ -14,7 +14,7 @@ use Symfony\Component\Validator\Constraint; * * @Plugin( * id = "UserNameUnique", - * label = @Translation("User name unique", context = "Validation") + * label = @Translation("User name unique", context = "Validation"), * ) */ class UserNameUnique extends Constraint { diff --git a/core/modules/user/src/Plugin/Validation/Constraint/UserUniqueValidator.php b/core/modules/user/src/Plugin/Validation/Constraint/UserUniqueValidator.php index b98408a1633b..1c65d0616712 100644 --- a/core/modules/user/src/Plugin/Validation/Constraint/UserUniqueValidator.php +++ b/core/modules/user/src/Plugin/Validation/Constraint/UserUniqueValidator.php @@ -18,20 +18,22 @@ class UserUniqueValidator extends ConstraintValidator { /** * {@inheritdoc} */ - public function validate($value, Constraint $constraint) { - $field = $this->context->getMetadata()->getTypedData()->getParent(); - $uid = $field->getParent()->id(); + public function validate($items, Constraint $constraint) { + if (!isset($items)) { + return; + } + $field_name = $items->getFieldDefinition()->getName(); $value_taken = (bool) \Drupal::entityQuery('user') // The UID could be NULL, so we cast it to 0 in that case. - ->condition('uid', (int) $uid, '<>') - ->condition($field->getName(), $value) + ->condition('uid', (int) $items->getEntity()->id(), '<>') + ->condition($field_name, db_like($items->first()->value), 'LIKE') ->range(0, 1) ->count() ->execute(); if ($value_taken) { - $this->context->addViolation($constraint->message, array("%value" => $value)); + $this->context->addViolation($constraint->message, array("%value" => $items->value)); } } } diff --git a/core/modules/user/src/Tests/UserValidationTest.php b/core/modules/user/src/Tests/UserValidationTest.php index 36da033430b1..958ef59c17df 100644 --- a/core/modules/user/src/Tests/UserValidationTest.php +++ b/core/modules/user/src/Tests/UserValidationTest.php @@ -78,7 +78,7 @@ class UserValidationTest extends DrupalUnitTestBase { $user->set('name', $name); $violations = $user->validate(); $this->assertEqual(count($violations), 1, 'Violation found when name is too long.'); - $this->assertEqual($violations[0]->getPropertyPath(), 'name.0.value'); + $this->assertEqual($violations[0]->getPropertyPath(), 'name'); $this->assertEqual($violations[0]->getMessage(), t('The username %name is too long: it must be %max characters or less.', array('%name' => $name, '%max' => 60))); // Create a second test user to provoke a name collision. @@ -90,7 +90,7 @@ class UserValidationTest extends DrupalUnitTestBase { $user->set('name', 'existing'); $violations = $user->validate(); $this->assertEqual(count($violations), 1, 'Violation found on name collision.'); - $this->assertEqual($violations[0]->getPropertyPath(), 'name.0.value'); + $this->assertEqual($violations[0]->getPropertyPath(), 'name'); $this->assertEqual($violations[0]->getMessage(), t('The name %name is already taken.', array('%name' => 'existing'))); // Make the name valid. @@ -115,11 +115,11 @@ class UserValidationTest extends DrupalUnitTestBase { $this->assertEqual($violations[1]->getPropertyPath(), 'mail.0.value'); $this->assertEqual($violations[1]->getMessage(), t('This value is not a valid email address.')); - // Provoke a email collision with an exsiting user. + // Provoke an email collision with an existing user. $user->set('mail', 'existing@example.com'); $violations = $user->validate(); $this->assertEqual(count($violations), 1, 'Violation found when email already exists.'); - $this->assertEqual($violations[0]->getPropertyPath(), 'mail.0.value'); + $this->assertEqual($violations[0]->getPropertyPath(), 'mail'); $this->assertEqual($violations[0]->getMessage(), t('The email address %mail is already taken.', array('%mail' => 'existing@example.com'))); $user->set('mail', NULL); diff --git a/core/modules/user/user.module b/core/modules/user/user.module index 75777bbe671e..e7afb5a4a846 100644 --- a/core/modules/user/user.module +++ b/core/modules/user/user.module @@ -17,7 +17,7 @@ use Drupal\user\Entity\User; use Drupal\user\UserInterface; use Drupal\user\RoleInterface; use Drupal\Core\Template\Attribute; -use Drupal\Core\TypedData\DataDefinition; +use Drupal\Core\Field\BaseFieldDefinition; use Symfony\Component\HttpFoundation\RedirectResponse; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; use Drupal\menu_link\Entity\MenuLink; @@ -332,7 +332,7 @@ function user_load_by_name($name) { * */ function user_validate_name($name) { - $definition = DataDefinition::create('string') + $definition = BaseFieldDefinition::create('string') ->addConstraint('UserName', array()); $data = \Drupal::typedDataManager()->create($definition); $data->setValue($name);