Skip to content

Commit

Permalink
[Validator] Fix using known option names as field names
Browse files Browse the repository at this point in the history
  • Loading branch information
HypeMC committed Dec 19, 2023
1 parent ddf3bcb commit e92d8a1
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 3 deletions.
11 changes: 8 additions & 3 deletions src/Symfony/Component/Validator/Constraints/Collection.php
Original file line number Diff line number Diff line change
Expand Up @@ -41,9 +41,14 @@ class Collection extends Composite
*/
public function __construct($fields = null, array $groups = null, $payload = null, bool $allowExtraFields = null, bool $allowMissingFields = null, string $extraFieldsMessage = null, string $missingFieldsMessage = null)
{
// no known options set? $fields is the fields array
if (\is_array($fields)
&& !array_intersect(array_keys($fields), ['groups', 'fields', 'allowExtraFields', 'allowMissingFields', 'extraFieldsMessage', 'missingFieldsMessage'])) {
static $knownOptions;

if (!isset($knownOptions)) {
$knownOptions = array_column((new \ReflectionMethod(__METHOD__))->getParameters(), 'name');
}

// unless all keys are known options, we assume $fields is the fields array
if (\is_array($fields) && array_diff(array_keys($fields), $knownOptions)) {
$fields = ['fields' => $fields];
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -113,4 +113,43 @@ public function testConstraintHasDefaultGroupWithOptionalValues()
$this->assertEquals(['Default'], $constraint->fields['foo']->groups);
$this->assertEquals(['Default'], $constraint->fields['bar']->groups);
}

public function testOnlySomeKeysAreKnowOptions()
{
$constraint = new Collection([
'fields' => [new Required()],
'properties' => [new Required()],
'catalog' => [new Optional()],
]);

$this->assertArrayHasKey('fields', $constraint->fields);
$this->assertInstanceOf(Required::class, $constraint->fields['fields']);
$this->assertArrayHasKey('properties', $constraint->fields);
$this->assertInstanceOf(Required::class, $constraint->fields['properties']);
$this->assertArrayHasKey('catalog', $constraint->fields);
$this->assertInstanceOf(Optional::class, $constraint->fields['catalog']);
}

public function testAllKeysAreKnowOptions()
{
$constraint = new Collection([
'fields' => [
'fields' => [new Required()],
'properties' => [new Required()],
'catalog' => [new Optional()],
],
'allowExtraFields' => true,
'extraFieldsMessage' => 'foo bar baz',
]);

$this->assertArrayHasKey('fields', $constraint->fields);
$this->assertInstanceOf(Required::class, $constraint->fields['fields']);
$this->assertArrayHasKey('properties', $constraint->fields);
$this->assertInstanceOf(Required::class, $constraint->fields['properties']);
$this->assertArrayHasKey('catalog', $constraint->fields);
$this->assertInstanceOf(Optional::class, $constraint->fields['catalog']);

$this->assertTrue($constraint->allowExtraFields);
$this->assertSame('foo bar baz', $constraint->extraFieldsMessage);
}
}

0 comments on commit e92d8a1

Please sign in to comment.