From e32a11e76bbe8be639987e331fb8c7e647e0a5e7 Mon Sep 17 00:00:00 2001 From: Alex Pott <alex.a.pott@googlemail.com> Date: Tue, 9 Sep 2014 19:37:40 +0100 Subject: [PATCH] =?UTF-8?q?Issue=20#2110345=20by=20mr.york,=20effulgentsia?= =?UTF-8?q?,=20D=C3=A9sir=C3=A9,=20fgm,=20fago,=20pfrenssen,=20stefan.r,?= =?UTF-8?q?=20Berdir,=20Rajendar=20Reddy:=20Simplify=20validation=20constr?= =?UTF-8?q?aint=20implementations=20for=20fields.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Constraint/CommentNameConstraintValidator.php | 6 +++--- core/modules/user/src/Entity/User.php | 4 ++-- .../Validation/Constraint/UserNameConstraint.php | 2 +- .../Constraint/UserNameConstraintValidator.php | 5 +++-- .../Validation/Constraint/UserNameUnique.php | 2 +- .../Validation/Constraint/UserUniqueValidator.php | 14 ++++++++------ core/modules/user/src/Tests/UserValidationTest.php | 8 ++++---- core/modules/user/user.module | 4 ++-- 8 files changed, 24 insertions(+), 21 deletions(-) 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 @@ public static function baseFieldDefinitions(EntityTypeInterface $entity_type) { ->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 @@ public static function baseFieldDefinitions(EntityTypeInterface $entity_type) { ->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 @@ * * @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 @@ * * @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 @@ function testValidation() { $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 @@ function testValidation() { $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 @@ function testValidation() { $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\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); -- GitLab