From c1ea6e457881f0d77cdadae2b2c37ea361eb7a1e Mon Sep 17 00:00:00 2001 From: Jamal Youssefi Date: Tue, 24 Feb 2015 16:14:26 +0100 Subject: [PATCH 01/10] display custom message for uniqueEntity constraint --- .../Validator/Constraints/UniqueEntityValidator.php | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/Symfony/Bridge/Doctrine/Validator/Constraints/UniqueEntityValidator.php b/src/Symfony/Bridge/Doctrine/Validator/Constraints/UniqueEntityValidator.php index 9aaf329abc186..76f78b9dc2eba 100644 --- a/src/Symfony/Bridge/Doctrine/Validator/Constraints/UniqueEntityValidator.php +++ b/src/Symfony/Bridge/Doctrine/Validator/Constraints/UniqueEntityValidator.php @@ -16,6 +16,7 @@ use Symfony\Component\Validator\Exception\UnexpectedTypeException; use Symfony\Component\Validator\Exception\ConstraintDefinitionException; use Symfony\Component\Validator\ConstraintValidator; +use Symfony\Component\PropertyAccess\PropertyAccess; /** * Unique Entity Validator checks if one or a set of fields contain unique values. @@ -134,6 +135,18 @@ public function validate($entity, Constraint $constraint) $errorPath = null !== $constraint->errorPath ? $constraint->errorPath : $fields[0]; $invalidValue = isset($criteria[$errorPath]) ? $criteria[$errorPath] : $criteria[$fields[0]]; + $vars = array(); + + if (preg_match_all('/{{ ([a-zA-Z0-9_]+) }}/i', $constraint->message, $vars) > 0) + { + $accessor = PropertyAccess::createPropertyAccessor(); + + foreach($vars[1] as $var) + { + $constraint->message = str_replace(sprintf("{{ %s }}", $var), $accessor->getValue($entity, $var), $constraint->message); + } + } + $this->buildViolation($constraint->message) ->atPath($errorPath) ->setInvalidValue($invalidValue) From f5a7ba6e12821d5cb3dd1916dfbd4a0a9a5847fa Mon Sep 17 00:00:00 2001 From: Jamal Youssefi Date: Wed, 25 Feb 2015 09:56:06 +0100 Subject: [PATCH 02/10] fix forgot code convention --- .../Validator/Constraints/UniqueEntityValidator.php | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/Symfony/Bridge/Doctrine/Validator/Constraints/UniqueEntityValidator.php b/src/Symfony/Bridge/Doctrine/Validator/Constraints/UniqueEntityValidator.php index 76f78b9dc2eba..4997d05ba3420 100644 --- a/src/Symfony/Bridge/Doctrine/Validator/Constraints/UniqueEntityValidator.php +++ b/src/Symfony/Bridge/Doctrine/Validator/Constraints/UniqueEntityValidator.php @@ -137,12 +137,11 @@ public function validate($entity, Constraint $constraint) $vars = array(); - if (preg_match_all('/{{ ([a-zA-Z0-9_]+) }}/i', $constraint->message, $vars) > 0) - { + if (preg_match_all('/{{ ([a-zA-Z0-9_]+) }}/i', $constraint->message, $vars) > 0) { + $accessor = PropertyAccess::createPropertyAccessor(); - foreach($vars[1] as $var) - { + foreach($vars[1] as $var) { $constraint->message = str_replace(sprintf("{{ %s }}", $var), $accessor->getValue($entity, $var), $constraint->message); } } From ece90663e7ac5a0a76f1f63cbf159e861ed6f490 Mon Sep 17 00:00:00 2001 From: Jamal Youssefi Date: Wed, 25 Feb 2015 10:05:01 +0100 Subject: [PATCH 03/10] fix code convention --- .../Doctrine/Validator/Constraints/UniqueEntityValidator.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Symfony/Bridge/Doctrine/Validator/Constraints/UniqueEntityValidator.php b/src/Symfony/Bridge/Doctrine/Validator/Constraints/UniqueEntityValidator.php index 4997d05ba3420..bc3b51e9afdf0 100644 --- a/src/Symfony/Bridge/Doctrine/Validator/Constraints/UniqueEntityValidator.php +++ b/src/Symfony/Bridge/Doctrine/Validator/Constraints/UniqueEntityValidator.php @@ -138,10 +138,9 @@ public function validate($entity, Constraint $constraint) $vars = array(); if (preg_match_all('/{{ ([a-zA-Z0-9_]+) }}/i', $constraint->message, $vars) > 0) { - $accessor = PropertyAccess::createPropertyAccessor(); - foreach($vars[1] as $var) { + foreach ($vars[1] as $var) { $constraint->message = str_replace(sprintf("{{ %s }}", $var), $accessor->getValue($entity, $var), $constraint->message); } } From a42fd8248597cc3fe81b65dce0254aa7f1618171 Mon Sep 17 00:00:00 2001 From: Jamal Youssefi Date: Sat, 4 Jul 2015 21:56:46 +0200 Subject: [PATCH 04/10] fix code convention --- .../Doctrine/Validator/Constraints/UniqueEntityValidator.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Symfony/Bridge/Doctrine/Validator/Constraints/UniqueEntityValidator.php b/src/Symfony/Bridge/Doctrine/Validator/Constraints/UniqueEntityValidator.php index f983e47b73448..5922ab9beb972 100644 --- a/src/Symfony/Bridge/Doctrine/Validator/Constraints/UniqueEntityValidator.php +++ b/src/Symfony/Bridge/Doctrine/Validator/Constraints/UniqueEntityValidator.php @@ -141,7 +141,7 @@ public function validate($entity, Constraint $constraint) $accessor = PropertyAccess::createPropertyAccessor(); foreach ($vars[1] as $var) { - $constraint->message = str_replace(sprintf("{{ %s }}", $var), $accessor->getValue($entity, $var), $constraint->message); + $constraint->message = str_replace(sprintf('{{ %s }}', $var), $accessor->getValue($entity, $var), $constraint->message); } } From 88c882c61e0c077b939f41cf63058f4111f8fc86 Mon Sep 17 00:00:00 2001 From: Jamal Youssefi Date: Sat, 11 Jul 2015 03:57:22 +0200 Subject: [PATCH 05/10] add test for uniqueEntity custom message --- .../Constraints/UniqueEntityValidatorTest.php | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/src/Symfony/Bridge/Doctrine/Tests/Validator/Constraints/UniqueEntityValidatorTest.php b/src/Symfony/Bridge/Doctrine/Tests/Validator/Constraints/UniqueEntityValidatorTest.php index 6efeebc451818..6644ccc995f2f 100644 --- a/src/Symfony/Bridge/Doctrine/Tests/Validator/Constraints/UniqueEntityValidatorTest.php +++ b/src/Symfony/Bridge/Doctrine/Tests/Validator/Constraints/UniqueEntityValidatorTest.php @@ -455,4 +455,34 @@ public function testEntityManagerNullObject() $this->validator->validate($entity, $constraint); } + + public function testCustomMessage() + { + $constraint = new UniqueEntity(array( + 'message' => 'An entity with name "{{ name }}" already exists.', + 'fields' => array('name'), + 'em' => self::EM_NAME, + )); + + $entity1 = new SingleIntIdEntity(1, 'Foo'); + $entity2 = new SingleIntIdEntity(2, 'Foo'); + + $this->validator->validate($entity1, $constraint); + + $this->assertNoViolation(); + + $this->em->persist($entity1); + $this->em->flush(); + + $this->validator->validate($entity1, $constraint); + + $this->assertNoViolation(); + + $this->validator->validate($entity2, $constraint); + + $this->buildViolation('An entity with name "Foo" already exists.') + ->atPath('property.path.name') + ->setInvalidValue('Foo') + ->assertRaised(); + } } From f5b11152f3bcf80463f7d677d9af790a5274bd5d Mon Sep 17 00:00:00 2001 From: Jamal Youssefi Date: Thu, 23 Jul 2015 22:47:30 +0200 Subject: [PATCH 06/10] update tests for uniqueEntity custom message --- .../Constraints/UniqueEntityValidatorTest.php | 33 ++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/src/Symfony/Bridge/Doctrine/Tests/Validator/Constraints/UniqueEntityValidatorTest.php b/src/Symfony/Bridge/Doctrine/Tests/Validator/Constraints/UniqueEntityValidatorTest.php index 6644ccc995f2f..ae8527cc8ee21 100644 --- a/src/Symfony/Bridge/Doctrine/Tests/Validator/Constraints/UniqueEntityValidatorTest.php +++ b/src/Symfony/Bridge/Doctrine/Tests/Validator/Constraints/UniqueEntityValidatorTest.php @@ -456,7 +456,7 @@ public function testEntityManagerNullObject() $this->validator->validate($entity, $constraint); } - public function testCustomMessage() + public function testCustomMessageWithOneUniqueField() { $constraint = new UniqueEntity(array( 'message' => 'An entity with name "{{ name }}" already exists.', @@ -485,4 +485,35 @@ public function testCustomMessage() ->setInvalidValue('Foo') ->assertRaised(); } + + public function testCustomMessageWithTwoUniqueFields() + { + $constraint = new UniqueEntity(array( + 'message' => 'An entity with name1 "{{ name }}" and name2 "{{ name2 }}" already exists.', + 'fields' => array('name', 'name2'), + 'em' => self::EM_NAME, + 'errorPath' => 'name2', + )); + + $entity1 = new DoubleNameEntity(1, 'Foo', 'Bar'); + $entity2 = new DoubleNameEntity(2, 'Foo', 'Bar'); + + $this->validator->validate($entity1, $constraint); + + $this->assertNoViolation(); + + $this->em->persist($entity1); + $this->em->flush(); + + $this->validator->validate($entity1, $constraint); + + $this->assertNoViolation(); + + $this->validator->validate($entity2, $constraint); + + $this->buildViolation('An entity with name1 "Foo" and name2 "Bar" already exists.') + ->atPath('property.path.name2') + ->setInvalidValue('Bar') + ->assertRaised(); + } } From 90a6f523a1d624febc89feb5e910e6bb5a0258e6 Mon Sep 17 00:00:00 2001 From: Jamal Youssefi Date: Sat, 10 Oct 2015 16:50:55 +0200 Subject: [PATCH 07/10] throw exception if PropertyAccess component is not available and add it to suggest section --- .../Doctrine/Validator/Constraints/UniqueEntityValidator.php | 5 +++++ src/Symfony/Bridge/Doctrine/composer.json | 3 ++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/Symfony/Bridge/Doctrine/Validator/Constraints/UniqueEntityValidator.php b/src/Symfony/Bridge/Doctrine/Validator/Constraints/UniqueEntityValidator.php index 0436af6b1443d..2be7924925de8 100644 --- a/src/Symfony/Bridge/Doctrine/Validator/Constraints/UniqueEntityValidator.php +++ b/src/Symfony/Bridge/Doctrine/Validator/Constraints/UniqueEntityValidator.php @@ -138,6 +138,11 @@ public function validate($entity, Constraint $constraint) $vars = array(); if (preg_match_all('/{{ ([a-zA-Z0-9_]+) }}/i', $constraint->message, $vars) > 0) { + + if (!class_exists('Symfony\\Component\\PropertyAccess\\PropertyAccess')) { + throw new \RuntimeException('Unable to access entity property as the Symfony PropertyAccess is not installed.'); + } + $accessor = PropertyAccess::createPropertyAccessor(); foreach ($vars[1] as $var) { diff --git a/src/Symfony/Bridge/Doctrine/composer.json b/src/Symfony/Bridge/Doctrine/composer.json index 338b3566ce1d0..cd919fe47a4b4 100644 --- a/src/Symfony/Bridge/Doctrine/composer.json +++ b/src/Symfony/Bridge/Doctrine/composer.json @@ -39,7 +39,8 @@ "symfony/validator": "", "doctrine/data-fixtures": "", "doctrine/dbal": "", - "doctrine/orm": "" + "doctrine/orm": "", + "symfony/property-access": "" }, "autoload": { "psr-0": { "Symfony\\Bridge\\Doctrine\\": "" } From 3ceda0856faeea107b256e0387085952102c2294 Mon Sep 17 00:00:00 2001 From: Jamal Youssefi Date: Sat, 10 Oct 2015 16:51:49 +0200 Subject: [PATCH 08/10] fix regex pattern --- .../Doctrine/Validator/Constraints/UniqueEntityValidator.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Symfony/Bridge/Doctrine/Validator/Constraints/UniqueEntityValidator.php b/src/Symfony/Bridge/Doctrine/Validator/Constraints/UniqueEntityValidator.php index 2be7924925de8..95a6f730cd69a 100644 --- a/src/Symfony/Bridge/Doctrine/Validator/Constraints/UniqueEntityValidator.php +++ b/src/Symfony/Bridge/Doctrine/Validator/Constraints/UniqueEntityValidator.php @@ -137,7 +137,7 @@ public function validate($entity, Constraint $constraint) $vars = array(); - if (preg_match_all('/{{ ([a-zA-Z0-9_]+) }}/i', $constraint->message, $vars) > 0) { + if (preg_match_all('/{{ ([a-zA-Z0-9_]+) }}/', $constraint->message, $vars) > 0) { if (!class_exists('Symfony\\Component\\PropertyAccess\\PropertyAccess')) { throw new \RuntimeException('Unable to access entity property as the Symfony PropertyAccess is not installed.'); From b5f239c3e4749c618974df51c83a3793e2c44bdf Mon Sep 17 00:00:00 2001 From: Jamal Youssefi Date: Sun, 11 Oct 2015 14:24:14 +0200 Subject: [PATCH 09/10] fix uniqueEntity parameters replacement and tests --- .../Validator/Constraints/UniqueEntityValidatorTest.php | 6 ++++-- .../Validator/Constraints/UniqueEntityValidator.php | 7 ++++--- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/Symfony/Bridge/Doctrine/Tests/Validator/Constraints/UniqueEntityValidatorTest.php b/src/Symfony/Bridge/Doctrine/Tests/Validator/Constraints/UniqueEntityValidatorTest.php index ae8527cc8ee21..315d30d875bc9 100644 --- a/src/Symfony/Bridge/Doctrine/Tests/Validator/Constraints/UniqueEntityValidatorTest.php +++ b/src/Symfony/Bridge/Doctrine/Tests/Validator/Constraints/UniqueEntityValidatorTest.php @@ -480,7 +480,8 @@ public function testCustomMessageWithOneUniqueField() $this->validator->validate($entity2, $constraint); - $this->buildViolation('An entity with name "Foo" already exists.') + $this->buildViolation('An entity with name "{{ name }}" already exists.') + ->setParameters(array("{{ name }}" => "Foo")) ->atPath('property.path.name') ->setInvalidValue('Foo') ->assertRaised(); @@ -511,7 +512,8 @@ public function testCustomMessageWithTwoUniqueFields() $this->validator->validate($entity2, $constraint); - $this->buildViolation('An entity with name1 "Foo" and name2 "Bar" already exists.') + $this->buildViolation('An entity with name1 "{{ name }}" and name2 "{{ name2 }}" already exists.') + ->setParameters(array("{{ name }}" => "Foo", "{{ name2 }}" => "Bar")) ->atPath('property.path.name2') ->setInvalidValue('Bar') ->assertRaised(); diff --git a/src/Symfony/Bridge/Doctrine/Validator/Constraints/UniqueEntityValidator.php b/src/Symfony/Bridge/Doctrine/Validator/Constraints/UniqueEntityValidator.php index 95a6f730cd69a..64f6fd89fde8d 100644 --- a/src/Symfony/Bridge/Doctrine/Validator/Constraints/UniqueEntityValidator.php +++ b/src/Symfony/Bridge/Doctrine/Validator/Constraints/UniqueEntityValidator.php @@ -136,6 +136,7 @@ public function validate($entity, Constraint $constraint) $invalidValue = isset($criteria[$errorPath]) ? $criteria[$errorPath] : $criteria[$fields[0]]; $vars = array(); + $paramaters = array(); if (preg_match_all('/{{ ([a-zA-Z0-9_]+) }}/', $constraint->message, $vars) > 0) { @@ -146,11 +147,11 @@ public function validate($entity, Constraint $constraint) $accessor = PropertyAccess::createPropertyAccessor(); foreach ($vars[1] as $var) { - $constraint->message = str_replace(sprintf('{{ %s }}', $var), $accessor->getValue($entity, $var), $constraint->message); + $paramaters[sprintf('{{ %s }}', $var)] = $accessor->getValue($entity, $var); } } - - $this->buildViolation($constraint->message) + + $this->buildViolation($constraint->message, $paramaters) ->atPath($errorPath) ->setInvalidValue($invalidValue) ->addViolation(); From 1c86b16e2ad41feddf10a220f8aa57ce008f7ce0 Mon Sep 17 00:00:00 2001 From: Jamal Youssefi Date: Sun, 11 Oct 2015 14:26:47 +0200 Subject: [PATCH 10/10] apply coding standard patch --- .../Tests/Validator/Constraints/UniqueEntityValidatorTest.php | 4 ++-- .../Doctrine/Validator/Constraints/UniqueEntityValidator.php | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Symfony/Bridge/Doctrine/Tests/Validator/Constraints/UniqueEntityValidatorTest.php b/src/Symfony/Bridge/Doctrine/Tests/Validator/Constraints/UniqueEntityValidatorTest.php index 315d30d875bc9..e23758a5df2e6 100644 --- a/src/Symfony/Bridge/Doctrine/Tests/Validator/Constraints/UniqueEntityValidatorTest.php +++ b/src/Symfony/Bridge/Doctrine/Tests/Validator/Constraints/UniqueEntityValidatorTest.php @@ -481,7 +481,7 @@ public function testCustomMessageWithOneUniqueField() $this->validator->validate($entity2, $constraint); $this->buildViolation('An entity with name "{{ name }}" already exists.') - ->setParameters(array("{{ name }}" => "Foo")) + ->setParameters(array('{{ name }}' => 'Foo')) ->atPath('property.path.name') ->setInvalidValue('Foo') ->assertRaised(); @@ -513,7 +513,7 @@ public function testCustomMessageWithTwoUniqueFields() $this->validator->validate($entity2, $constraint); $this->buildViolation('An entity with name1 "{{ name }}" and name2 "{{ name2 }}" already exists.') - ->setParameters(array("{{ name }}" => "Foo", "{{ name2 }}" => "Bar")) + ->setParameters(array('{{ name }}' => 'Foo', '{{ name2 }}' => 'Bar')) ->atPath('property.path.name2') ->setInvalidValue('Bar') ->assertRaised(); diff --git a/src/Symfony/Bridge/Doctrine/Validator/Constraints/UniqueEntityValidator.php b/src/Symfony/Bridge/Doctrine/Validator/Constraints/UniqueEntityValidator.php index 64f6fd89fde8d..6e462ab33a682 100644 --- a/src/Symfony/Bridge/Doctrine/Validator/Constraints/UniqueEntityValidator.php +++ b/src/Symfony/Bridge/Doctrine/Validator/Constraints/UniqueEntityValidator.php @@ -150,7 +150,7 @@ public function validate($entity, Constraint $constraint) $paramaters[sprintf('{{ %s }}', $var)] = $accessor->getValue($entity, $var); } } - + $this->buildViolation($constraint->message, $paramaters) ->atPath($errorPath) ->setInvalidValue($invalidValue)