Skip to content

Commit ce16587

Browse files
committed
bug #7559 Fix passing single constraints to image and file fields (javiereguiluz)
This PR was squashed before being merged into the 5.x branch. Discussion ---------- Fix passing single constraints to image and file fields Fixes #7557. Commits ------- 87e4641 Fix passing single constraints to image and file fields
2 parents adc67ac + 87e4641 commit ce16587

6 files changed

Lines changed: 60 additions & 8 deletions

File tree

src/Field/Configurator/FileConfigurator.php

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,10 @@ public function configure(FieldDto $field, EntityDto $entityDto, AdminContext $c
154154
}
155155

156156
if ([] !== $processedMimeTypes) {
157-
$constraints = $field->getCustomOption(FileField::OPTION_FILE_CONSTRAINTS);
157+
$constraints = $field->getCustomOption(FileField::OPTION_FILE_CONSTRAINTS) ?? [];
158+
if (!\is_array($constraints)) {
159+
$constraints = [$constraints];
160+
}
158161
$mimeTypesMessage = $field->getCustomOption(FileField::OPTION_MIME_TYPES_MESSAGE);
159162
$constraints[] = new FileConstraint(mimeTypes: $processedMimeTypes, mimeTypesMessage: $mimeTypesMessage);
160163
$field->setCustomOption(FileField::OPTION_FILE_CONSTRAINTS, $constraints);
@@ -163,7 +166,10 @@ public function configure(FieldDto $field, EntityDto $entityDto, AdminContext $c
163166

164167
$maxSize = $field->getCustomOption(FileField::OPTION_MAX_SIZE);
165168
if (null !== $maxSize) {
166-
$constraints = $field->getCustomOption(FileField::OPTION_FILE_CONSTRAINTS);
169+
$constraints = $field->getCustomOption(FileField::OPTION_FILE_CONSTRAINTS) ?? [];
170+
if (!\is_array($constraints)) {
171+
$constraints = [$constraints];
172+
}
167173
$maxSizeMessage = $field->getCustomOption(FileField::OPTION_MAX_SIZE_MESSAGE);
168174
$constraints[] = new FileConstraint(maxSize: $maxSize, maxSizeMessage: $maxSizeMessage);
169175
$field->setCustomOption(FileField::OPTION_FILE_CONSTRAINTS, $constraints);

src/Field/Configurator/ImageConfigurator.php

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,10 @@ public function configure(FieldDto $field, EntityDto $entityDto, AdminContext $c
144144
}
145145

146146
if ([] !== $processedMimeTypes) {
147-
$constraints = $field->getCustomOption(ImageField::OPTION_FILE_CONSTRAINTS);
147+
$constraints = $field->getCustomOption(ImageField::OPTION_FILE_CONSTRAINTS) ?? [];
148+
if (!\is_array($constraints)) {
149+
$constraints = [$constraints];
150+
}
148151
$mimeTypesMessage = $field->getCustomOption(ImageField::OPTION_MIME_TYPES_MESSAGE);
149152
$constraints[] = new FileConstraint(mimeTypes: $processedMimeTypes, mimeTypesMessage: $mimeTypesMessage);
150153
$field->setCustomOption(ImageField::OPTION_FILE_CONSTRAINTS, $constraints);
@@ -153,7 +156,10 @@ public function configure(FieldDto $field, EntityDto $entityDto, AdminContext $c
153156

154157
$maxSize = $field->getCustomOption(ImageField::OPTION_MAX_SIZE);
155158
if (null !== $maxSize) {
156-
$constraints = $field->getCustomOption(ImageField::OPTION_FILE_CONSTRAINTS);
159+
$constraints = $field->getCustomOption(ImageField::OPTION_FILE_CONSTRAINTS) ?? [];
160+
if (!\is_array($constraints)) {
161+
$constraints = [$constraints];
162+
}
157163
$maxSizeMessage = $field->getCustomOption(ImageField::OPTION_MAX_SIZE_MESSAGE);
158164
$constraints[] = new FileConstraint(maxSize: $maxSize, maxSizeMessage: $maxSizeMessage);
159165
$field->setCustomOption(ImageField::OPTION_FILE_CONSTRAINTS, $constraints);

src/Field/FileField.php

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,8 +112,18 @@ public function setUploadedFileNamePattern(string|\Closure $patternOrCallable):
112112
*
113113
* Define constraints to be validated on the FileType
114114
*/
115-
public function setFileConstraints($constraints): self
115+
public function setFileConstraints(Constraint|array $constraints): self
116116
{
117+
if (\is_array($constraints)) {
118+
foreach ($constraints as $key => $constraint) {
119+
if (!$constraint instanceof Constraint) {
120+
throw new \InvalidArgumentException(sprintf('The "%s" method expects a "%s" instance or an array of them; got "%s" at key "%s".', __METHOD__, Constraint::class, get_debug_type($constraint), $key));
121+
}
122+
}
123+
} else {
124+
$constraints = [$constraints];
125+
}
126+
117127
$this->setCustomOption(self::OPTION_FILE_CONSTRAINTS, $constraints);
118128

119129
return $this;

src/Field/ImageField.php

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,8 +119,18 @@ public function setUploadedFileNamePattern(string|\Closure $patternOrCallable):
119119
* Define constraints to be validated on the FileType.
120120
* Image constraint is set by default.
121121
*/
122-
public function setFileConstraints($constraints): self
122+
public function setFileConstraints(Constraint|array $constraints): self
123123
{
124+
if (\is_array($constraints)) {
125+
foreach ($constraints as $key => $constraint) {
126+
if (!$constraint instanceof Constraint) {
127+
throw new \InvalidArgumentException(sprintf('The "%s" method expects a "%s" instance or an array of them; got "%s" at key "%s".', __METHOD__, Constraint::class, get_debug_type($constraint), $key));
128+
}
129+
}
130+
} else {
131+
$constraints = [$constraints];
132+
}
133+
124134
$this->setCustomOption(self::OPTION_FILE_CONSTRAINTS, $constraints);
125135

126136
return $this;

tests/Unit/Field/FileFieldTest.php

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ public function testSetFileConstraintsWithSingleConstraint(): void
118118
$field->setFileConstraints($constraint);
119119
$fieldDto = $this->configure($field);
120120

121-
self::assertSame($constraint, $fieldDto->getCustomOption(FileField::OPTION_FILE_CONSTRAINTS));
121+
self::assertSame([$constraint], $fieldDto->getCustomOption(FileField::OPTION_FILE_CONSTRAINTS));
122122
}
123123

124124
public function testSetFileConstraintsWithMultipleConstraints(): void
@@ -134,6 +134,16 @@ public function testSetFileConstraintsWithMultipleConstraints(): void
134134
self::assertSame($constraints, $fieldDto->getCustomOption(FileField::OPTION_FILE_CONSTRAINTS));
135135
}
136136

137+
public function testSetFileConstraintsRejectsNonConstraintArrayItems(): void
138+
{
139+
$field = FileField::new('document');
140+
141+
$this->expectException(\InvalidArgumentException::class);
142+
$this->expectExceptionMessage('expects a "Symfony\Component\Validator\Constraint" instance or an array of them');
143+
144+
$field->setFileConstraints([new File(maxSize: '10M'), 'not-a-constraint']);
145+
}
146+
137147
public function testUploadPatternPlaceholders(): void
138148
{
139149
$patterns = [

tests/Unit/Field/ImageFieldTest.php

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ public function testSetFileConstraintsWithSingleConstraint(): void
135135
$field->setFileConstraints($constraint);
136136
$fieldDto = $this->configure($field);
137137

138-
self::assertSame($constraint, $fieldDto->getCustomOption(ImageField::OPTION_FILE_CONSTRAINTS));
138+
self::assertSame([$constraint], $fieldDto->getCustomOption(ImageField::OPTION_FILE_CONSTRAINTS));
139139
}
140140

141141
public function testSetFileConstraintsWithMultipleConstraints(): void
@@ -169,6 +169,16 @@ public function testSetFileConstraintsWithMultipleConstraints(): void
169169
self::assertSame($constraints, $fieldDto->getCustomOption(ImageField::OPTION_FILE_CONSTRAINTS));
170170
}
171171

172+
public function testSetFileConstraintsRejectsNonConstraintArrayItems(): void
173+
{
174+
$field = ImageField::new('image');
175+
176+
$this->expectException(\InvalidArgumentException::class);
177+
$this->expectExceptionMessage('expects a "Symfony\Component\Validator\Constraint" instance or an array of them');
178+
179+
$field->setFileConstraints([new Image(), 'not-a-constraint']);
180+
}
181+
172182
public function testUploadPatternPlaceholders(): void
173183
{
174184
// test various placeholders that can be used

0 commit comments

Comments
 (0)