diff --git a/src/Symfony/Component/Validator/Constraints/Collection.php b/src/Symfony/Component/Validator/Constraints/Collection.php index 3f4adb5ac5286..b151f0cd4df67 100644 --- a/src/Symfony/Component/Validator/Constraints/Collection.php +++ b/src/Symfony/Component/Validator/Constraints/Collection.php @@ -11,6 +11,7 @@ namespace Symfony\Component\Validator\Constraints; +use Symfony\Component\Validator\Constraint; use Symfony\Component\Validator\Exception\ConstraintDefinitionException; /** @@ -41,9 +42,10 @@ 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'])) { + && (($firstField = reset($fields)) instanceof Constraint + || ($firstField[0] ?? null) instanceof Constraint + )) { $fields = ['fields' => $fields]; } diff --git a/src/Symfony/Component/Validator/Tests/Constraints/CollectionTest.php b/src/Symfony/Component/Validator/Tests/Constraints/CollectionTest.php index a362e96ceec88..e5685a4acc7ed 100644 --- a/src/Symfony/Component/Validator/Tests/Constraints/CollectionTest.php +++ b/src/Symfony/Component/Validator/Tests/Constraints/CollectionTest.php @@ -18,6 +18,7 @@ use Symfony\Component\Validator\Constraints\Required; use Symfony\Component\Validator\Constraints\Valid; use Symfony\Component\Validator\Exception\ConstraintDefinitionException; +use Symfony\Component\Validator\Exception\InvalidOptionsException; /** * @author Bernhard Schussek @@ -34,7 +35,7 @@ public function testRejectInvalidFieldsOption() public function testRejectNonConstraints() { - $this->expectException(ConstraintDefinitionException::class); + $this->expectException(InvalidOptionsException::class); new Collection([ 'foo' => 'bar', ]); @@ -113,4 +114,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); + } }