8000 bug #53133 [Validator] Fix using known option names as field names (H… · symfony/symfony@d34c8c4 · GitHub
[go: up one dir, main page]

Skip to content

Commit d34c8c4

Browse files
committed
bug #53133 [Validator] Fix using known option names as field names (HypeMC)
This PR was merged into the 5.4 branch. Discussion ---------- [Validator] Fix using known option names as field names | Q | A | ------------- | --- | Branch? | 5.4 | Bug fix? | yes | New feature? | no | Deprecations? | no | Issues | Fix #52993 | License | MIT Instead of assuming `$fields` is not the fields array when any of the keys is a known option, let's assume it is the fields array if all keys are known options. Of course, this approach won't work if someone names all their fields after known options, but I don't believe that will actually happen. Commits ------- 51ec528 [Validator] Fix using known option names as field names
2 parents a107a5a + 51ec528 commit d34c8c4

File tree

2 files changed

+45
-3
lines changed

2 files changed

+45
-3
lines changed

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

+4-2
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

+41-1
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)
0