10000 [Validator] Fix using known option names as field names · symfony/symfony@e92d8a1 · GitHub
[go: up one dir, main page]

Skip to content

Commit e92d8a1

Browse files
committed
[Validator] Fix using known option names as field names
1 parent ddf3bcb commit e92d8a1

File tree

2 files changed

+47
-3
lines changed

2 files changed

+47
-3
lines changed

src/Symfony/Component/Validator/Constraints/Collection.php

+8-3
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,14 @@ class Collection extends Composite
4141
*/
4242
public function __construct($fields = null, array $groups = null, $payload = null, bool $allowExtraFields = null, bool $allowMissingFields = null, string $extraFieldsMessage = null, string $missingFieldsMessage = null)
4343
{
44-
// no known options set? $fields is the fields array
45-
if (\is_array($fields)
46-
&& !array_intersect(array_keys($fields), ['groups', 'fields', 'allowExtraFields', 'allowMissingFields', 'extraFieldsMessage', 'missingFieldsMessage'])) {
44+
static $knownOptions;
45+
46+
if (!isset($knownOptions)) {
47+
$knownOptions = array_column((new \ReflectionMethod(__METHOD__))->getParameters(), 'name');
48+
}
49+
50+
// unless all keys are known options, we assume $fields is the fields array
51+
if (\is_array($fields) && array_diff(array_keys($fields), $knownOptions)) {
4752
$fields = ['fields' => $fields];
4853
}
4954

src/Symfony/Component/Validator/Tests/Constraints/CollectionTest.php

+39
Original file line numberDiff line numberDiff line change
@@ -113,4 +113,43 @@ public function testConstraintHasDefaultGroupWithOptionalValues()
113113
$this->assertEquals(['Default'], $constraint->fields['foo']->groups);
114114
$this->assertEquals(['Default'], $constraint->fields['bar']->groups);
115115
}
116+
117+
public function testOnlySomeKeysAreKnowOptions()
118+
{
119+
$constraint = new Collection([
120+
'fields' => [new Required()],
121+
'properties' => [new Required()],
122+
'catalog' => [new Optional()],
123+
]);
124+
125+
$this->assertArrayHasKey('fields', $constraint->fields);
126+
$this->assertInstanceOf(Required::class, $constraint->fields['fields']);
127+
$this->assertArrayHasKey('properties', $constraint->fields);
128+
$this->assertInstanceOf(Required::class, $constraint->fields['properties']);
129+
$this->assertArrayHasKey('catalog', $constraint->fields);
130+
$this->assertInstanceOf(Optional::class, $constraint->fields['catalog']);
131+
}
132+
133+
public function testAllKeysAreKnowOptions()
134+
{
135+
$constraint = new Collection([
136+
'fields' => [
137+
'fields' => [new Required()],
138+
'properties' => [new Required()],
139+
'catalog' => [new Optional()],
140+
],
141+
'allowExtraFields' => true,
142+
'extraFieldsMessage' => 'foo bar baz',
143+
]);
144+
145+
$this->assertArrayHasKey('fields', $constraint->fields);
146+
$this->assertInstanceOf(Required::class, $constraint->fields['fields']);
147+
$this->assertArrayHasKey('properties', $constraint->fields);
148+
$this->assertInstanceOf(Required::class, $constraint->fields['properties']);
149+
$this->assertArrayHasKey('catalog', $constraint->fields);
150+
$this->assertInstanceOf(Optional::class, $constraint->fields['catalog']);
151+
152+
$this->assertTrue($constraint->allowExtraFields);
153+
$this->assertSame('foo bar baz', $constraint->extraFieldsMessage);
154+
}
116155
}

0 commit comments

Comments
 (0)
0