Skip to content

Commit 92661f1

Browse files
committed
Add support for identifierFieldNames option
1 parent 1348473 commit 92661f1

File tree

2 files changed

+79
-13
lines changed

2 files changed

+79
-13
lines changed

src/Validator/Constraints/Unique.php

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,12 @@
77
use Attribute;
88
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
99

10+
use function array_combine;
11+
use function array_filter;
12+
use function array_slice;
13+
use function func_get_args;
14+
use function func_num_args;
15+
1016
/**
1117
* Constraint for the unique document validator
1218
*
@@ -23,28 +29,26 @@ class Unique extends UniqueEntity
2329
public function __construct(
2430
array|string $fields,
2531
?string $message = null,
26-
string $service = 'doctrine_odm.mongodb.unique',
32+
?string $service = null,
2733
?string $em = null,
2834
?string $entityClass = null,
2935
?string $repositoryMethod = null,
3036
?string $errorPath = null,
3137
bool|array|string|null $ignoreNull = null,
38+
?array $identifierFieldNames = null,
3239
?array $groups = null,
3340
mixed $payload = null,
3441
array $options = [],
3542
) {
36-
parent::__construct(
37-
fields: $fields,
38-
message: $message,
39-
service: $service,
40-
em: $em,
41-
entityClass: $entityClass,
42-
repositoryMethod: $repositoryMethod,
43-
errorPath: $errorPath,
44-
ignoreNull: $ignoreNull,
45-
groups: $groups,
46-
payload: $payload,
47-
options: $options,
43+
// Call the parent constructor using named arguments
44+
// symfony/doctrine-bridge 7.3 added the parameter $identifierFieldNames
45+
$args = array_combine(
46+
array_slice(['fields', 'message', 'service', 'em', 'entityClass', 'repositoryMethod', 'errorPath', 'ignoreNull', 'identifierFieldNames', 'groups', 'payload', 'options'], 0, func_num_args()),
47+
func_get_args(),
4848
);
49+
$args = array_filter($args, static fn ($v) => $v !== null);
50+
$args['service'] ??= 'doctrine_odm.mongodb.unique';
51+
52+
parent::__construct(...$args);
4953
}
5054
}

tests/Validator/Constraints/UniqueTest.php

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44

55
namespace Doctrine\Bundle\MongoDBBundle\Tests\Validator\Constraints;
66

7+
use Composer\InstalledVersions;
8+
use Composer\Semver\VersionParser;
79
use Doctrine\Bundle\MongoDBBundle\Validator\Constraints\Unique;
810
use PHPUnit\Framework\TestCase;
911
use Symfony\Component\Validator\Mapping\ClassMetadata;
@@ -23,6 +25,45 @@ public function testWithDefaultProperty(): void
2325
self::assertInstanceOf(Unique::class, $constraint);
2426
self::assertSame(['email'], $constraint->fields);
2527
self::assertSame('doctrine_odm.mongodb.unique', $constraint->validatedBy());
28+
self::assertNull($constraint->em);
29+
}
30+
31+
public function testWithGroups(): void
32+
{
33+
$metadata = new ClassMetadata(UniqueDocumentWithGroups::class);
34+
35+
$loader = new AttributeLoader();
36+
self::assertTrue($loader->loadClassMetadata($metadata));
37+
38+
[$constraint] = $metadata->getConstraints();
39+
self::assertInstanceOf(Unique::class, $constraint);
40+
self::assertSame(['email'], (array) $constraint->fields);
41+
self::assertSame(['group1'], $constraint->groups);
42+
self::assertSame('doctrine_odm.mongodb.unique', $constraint->validatedBy());
43+
self::assertNull($constraint->em);
44+
}
45+
46+
public function testWithIdentifierFieldNames(): void
47+
{
48+
if (! InstalledVersions::satisfies(new VersionParser(), 'symfony/doctrine-bridge', '>= 7.3')) {
49+
self::markTestSkipped('Requires symfony/doctrine-bridge 7.3 or higher, with $identifierFieldNames field');
50+
}
51+
52+
$metadata = new ClassMetadata(UniqueDocumentWithIdentifierFieldNames::class);
53+
54+
$loader = new AttributeLoader();
55+
56+
self::assertTrue($loader->loadClassMetadata($metadata));
57+
58+
[$constraint] = $metadata->getConstraints();
59+
self::assertInstanceOf(Unique::class, $constraint);
60+
self::assertSame(['email'], $constraint->fields);
61+
self::assertSame('Custom message', $constraint->message);
62+
self::assertSame('custom_em', $constraint->em);
63+
self::assertFalse($constraint->ignoreNull);
64+
self::assertSame(['id', 'name'], $constraint->identifierFieldNames);
65+
self::assertSame(['group1', 'group2'], $constraint->groups);
66+
self::assertSame('doctrine_odm.mongodb.unique', $constraint->validatedBy());
2667
}
2768
}
2869

@@ -31,3 +72,24 @@ class UniqueDocumentDummyOne
3172
{
3273
private string $email;
3374
}
75+
76+
#[Unique(fields: 'email', groups: ['group1'])]
77+
class UniqueDocumentWithGroups
78+
{
79+
private string $email;
80+
}
81+
82+
#[Unique(
83+
['email'],
84+
'Custom message',
85+
em: 'custom_em',
86+
ignoreNull: false,
87+
identifierFieldNames: ['id', 'name'],
88+
groups: ['group1', 'group2'],
89+
)]
90+
class UniqueDocumentWithIdentifierFieldNames
91+
{
92+
private string $name;
93+
94+
private string $email;
95+
}

0 commit comments

Comments
 (0)