Skip to content

Commit 51ec528

Browse files
committed
[Validator] Fix using known option names as field names
1 parent 5d9b029 commit 51ec528

File tree

2 files changed

+45
-3
lines changed

2 files changed

+45
-3
lines changed

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
namespace Symfony\Component\Validator\Constraints;
1313

14+
use Symfony\Component\Validator\Constraint;
1415
use Symfony\Component\Validator\Exception\ConstraintDefinitionException;
1516

1617
/**
@@ -41,9 +42,10 @@ class Collection extends Composite
4142
*/
4243
public function __construct($fields = null, array $groups = null, $payload = null, bool $allowExtraFields = null, bool $allowMissingFields = null, string $extraFieldsMessage = null, string $missingFieldsMessage = null)
4344
{
44-
// no known options set? $fields is the fields array
4545
if (\is_array($fields)
46-
&& !array_intersect(array_keys($fields), ['groups', 'fields', 'allowExtraFields', 'allowMissingFields', 'extraFieldsMessage', 'missingFieldsMessage'])) {
46+
&& (($firstField = reset($fields)) instanceof Constraint
47+
|| ($firstField[0] ?? null) instanceof Constraint
48+
)) {
4749
$fields = ['fields' => $fields];
4850
}
4951

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

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
use Symfony\Component\Validator\Constraints\Required;
1919
use Symfony\Component\Validator\Constraints\Valid;
2020
use Symfony\Component\Validator\Exception\ConstraintDefinitionException;
21+
use Symfony\Component\Validator\Exception\InvalidOptionsException;
2122

2223
/**
2324
* @author Bernhard Schussek <bschussek@gmail.com>
@@ -34,7 +35,7 @@ public function testRejectInvalidFieldsOption()
3435

3536
public function testRejectNonConstraints()
3637
{
37-
$this->expectException(ConstraintDefinitionException::class);
38+
$this->expectException(InvalidOptionsException::class);
3839
new Collection([
3940
'foo' => 'bar',
4041
]);
@@ -113,4 +114,43 @@ public function testConstraintHasDefaultGroupWithOptionalValues()
113114
$this->assertEquals(['Default'], $constraint->fields['foo']->groups);
114115
$this->assertEquals(['Default'], $constraint->fields['bar']->groups);
115116
}
117+
118+
public function testOnlySomeKeysAreKnowOptions()
119+
{
120+
$constraint = new Collection([
121+
'fields' => [new Required()],
122+
'properties' => [new Required()],
123+
'catalog' => [new Optional()],
124+
]);
125+
126+
$this->assertArrayHasKey('fields', $constraint->fields);
127+
$this->assertInstanceOf(Required::class, $constraint->fields['fields']);
128+
$this->assertArrayHasKey('properties', $constraint->fields);
129+
$this->assertInstanceOf(Required::class, $constraint->fields['properties']);
130+
$this->assertArrayHasKey('catalog', $constraint->fields);
131+
$this->assertInstanceOf(Optional::class, $constraint->fields['catalog']);
132+
}
133+
134+
public function testAllKeysAreKnowOptions()
135+
{
136+
$constraint = new Collection([
137+
'fields' => [
138+
'fields' => [new Required()],
139+
'properties' => [new Required()],
140+
'catalog' => [new Optional()],
141+
],
142+
'allowExtraFields' => true,
143+
'extraFieldsMessage' => 'foo bar baz',
144+
]);
145+
146+
$this->assertArrayHasKey('fields', $constraint->fields);
147+
$this->assertInstanceOf(Required::class, $constraint->fields['fields']);
148+
$this->assertArrayHasKey('properties', $constraint->fields);
149+
$this->assertInstanceOf(Required::class, $constraint->fields['properties']);
150+
$this->assertArrayHasKey('catalog', $constraint->fields);
151+
$this->assertInstanceOf(Optional::class, $constraint->fields['catalog']);
152+
153+
$this->assertTrue($constraint->allowExtraFields);
154+
$this->assertSame('foo bar baz', $constraint->extraFieldsMessage);
155+
}
116156
}

0 commit comments

Comments
 (0)