Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit3fd23b7

Browse files
committed
[Doctrine Bridge] fix UniqueEntityValidator for composite object primary keys
1 parentcbb5332 commit3fd23b7

File tree

3 files changed

+107
-1
lines changed

3 files changed

+107
-1
lines changed
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
<?php
2+
3+
namespaceSymfony\Bridge\Doctrine\Tests\Fixtures;
4+
useDoctrine\ORM\MappingasORM;
5+
6+
/**
7+
* an entity that has two objects (class without toString methods) as primary key
8+
*
9+
* @ORM\Entity
10+
*/
11+
class CompositeObjectNoToStringIdEntity
12+
{
13+
/**
14+
* @var SingleIntIdNoToStringEntity
15+
*
16+
* @ORM\Id
17+
* @ORM\ManyToOne(targetEntity="SingleIntIdNoToStringEntity", cascade={"persist"})
18+
* @ORM\JoinColumn(name="object_one_id")
19+
*/
20+
protected$objectOne;
21+
22+
/**
23+
* @var SingleIntIdNoToStringEntity
24+
*
25+
* @ORM\Id
26+
* @ORM\ManyToOne(targetEntity="SingleIntIdNoToStringEntity", cascade={"persist"})
27+
* @ORM\JoinColumn(name="object_two_id")
28+
*/
29+
protected$objectTwo;
30+
31+
publicfunction__construct(SingleIntIdNoToStringEntity$objectOne,SingleIntIdNoToStringEntity$objectTwo)
32+
{
33+
$this->objectOne =$objectOne;
34+
$this->objectTwo =$objectTwo;
35+
}
36+
37+
/**
38+
* @return SingleIntIdNoToStringEntity
39+
*/
40+
publicfunctiongetObjectOne()
41+
{
42+
return$this->objectOne;
43+
}
44+
45+
/**
46+
* @return SingleIntIdNoToStringEntity
47+
*/
48+
publicfunctiongetObjectTwo()
49+
{
50+
return$this->objectTwo;
51+
}
52+
}

‎src/Symfony/Bridge/Doctrine/Tests/Validator/Constraints/UniqueEntityValidatorTest.php‎

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
useDoctrine\Common\Persistence\ObjectRepository;
1818
useSymfony\Bridge\Doctrine\Test\DoctrineTestHelper;
1919
useSymfony\Bridge\Doctrine\Test\TestRepositoryFactory;
20+
useSymfony\Bridge\Doctrine\Tests\Fixtures\CompositeObjectNoToStringIdEntity;
2021
useSymfony\Bridge\Doctrine\Tests\Fixtures\SingleIntIdEntity;
2122
useSymfony\Bridge\Doctrine\Tests\Fixtures\DoubleNameEntity;
2223
useSymfony\Bridge\Doctrine\Tests\Fixtures\AssociationEntity;
@@ -140,6 +141,7 @@ private function createSchema(ObjectManager $em)
140141
$em->getClassMetadata('Symfony\Bridge\Doctrine\Tests\Fixtures\CompositeIntIdEntity'),
141142
$em->getClassMetadata('Symfony\Bridge\Doctrine\Tests\Fixtures\AssociationEntity'),
142143
$em->getClassMetadata('Symfony\Bridge\Doctrine\Tests\Fixtures\AssociationEntity2'),
144+
$em->getClassMetadata('Symfony\Bridge\Doctrine\Tests\Fixtures\CompositeObjectNoToStringIdEntity'),
143145
));
144146
}
145147

@@ -561,4 +563,33 @@ public function testEntityManagerNullObject()
561563

562564
$this->validator->validate($entity,$constraint);
563565
}
566+
567+
publicfunctiontestValidateUniquenessWithCompositeObjectNoToStringIdEntity()
568+
{
569+
$constraint =newUniqueEntity(array(
570+
'message' =>'myMessage',
571+
'fields' =>array('objectOne','objectTwo'),
572+
'em' =>self::EM_NAME,
573+
));
574+
575+
$objectOne =newSingleIntIdNoToStringEntity(1,'foo');
576+
$objectTwo =newSingleIntIdNoToStringEntity(2,'bar');
577+
$entity =newCompositeObjectNoToStringIdEntity($objectOne,$objectTwo);
578+
579+
$this->em->persist($entity);
580+
$this->em->flush();
581+
582+
$newEntity =newCompositeObjectNoToStringIdEntity($objectOne,$objectTwo);
583+
584+
$this->validator->validate($newEntity,$constraint);
585+
586+
$expectedValue ='Object of class "Symfony\Bridge\Doctrine\Tests\Fixtures\CompositeObjectNoToStringIdEntity" identified by "(Object of class "Symfony\Bridge\Doctrine\Tests\Fixtures\SingleIntIdNoToStringEntity" identified by "1"), (Object of class "Symfony\Bridge\Doctrine\Tests\Fixtures\SingleIntIdNoToStringEntity" identified by "2")"';
587+
588+
$this->buildViolation('myMessage')
589+
->atPath('property.path.objectOne')
590+
->setParameter('{{ value }}','"'.$expectedValue.'"')
591+
->setInvalidValue($expectedValue)
592+
->setCode(UniqueEntity::NOT_UNIQUE_ERROR)
593+
->assertRaised();
594+
}
564595
}

‎src/Symfony/Bridge/Doctrine/Validator/Constraints/UniqueEntityValidator.php‎

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
namespaceSymfony\Bridge\Doctrine\Validator\Constraints;
1313

1414
useDoctrine\Common\Persistence\ManagerRegistry;
15+
useDoctrine\Common\Persistence\Mapping\ClassMetadata;
16+
useDoctrine\Common\Persistence\ObjectManager;
1517
useSymfony\Component\Validator\Constraint;
1618
useSymfony\Component\Validator\Exception\UnexpectedTypeException;
1719
useSymfony\Component\Validator\Exception\ConstraintDefinitionException;
@@ -128,7 +130,7 @@ public function validate($entity, Constraint $constraint)
128130
$invalidValue =isset($criteria[$errorPath]) ?$criteria[$errorPath] :$criteria[$fields[0]];
129131

130132
if (is_object($invalidValue) && !method_exists($invalidValue,'__toString')) {
131-
$invalidValue =sprintf('Object of class "%s" identified by "%s"',get_class($entity),implode(',',$class->getIdentifierValues($entity)));
133+
$invalidValue =$this->buildInvalidValueString($em,$class,$entity);
132134
}
133135

134136
$this->context->buildViolation($constraint->message)
@@ -138,4 +140,25 @@ public function validate($entity, Constraint $constraint)
138140
->setCode(UniqueEntity::NOT_UNIQUE_ERROR)
139141
->addViolation();
140142
}
143+
144+
/**
145+
* @param ObjectManager $em
146+
* @param ClassMetadata $class
147+
* @param object $entity
148+
*
149+
* @return string
150+
*/
151+
privatefunctionbuildInvalidValueString(ObjectManager$em,ClassMetadata$class,$entity)
152+
{
153+
$identifiers =array_map(function ($identifier)use ($em) {
154+
// identifiers can be objects (without any __toString method) if its a composite PK
155+
if (is_object($identifier) && !method_exists($identifier,'__toString')) {
156+
returnsprintf('(%s)',$this->buildInvalidValueString($em,$em->getClassMetadata(get_class($identifier)),$identifier));
157+
}
158+
159+
return$identifier;
160+
},$class->getIdentifierValues($entity));
161+
162+
returnsprintf('Object of class "%s" identified by "%s"',get_class($entity),implode(',',$identifiers));
163+
}
141164
}

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp