🎻
[Symfony] フォームのFileTypeでmultipleを使っているときのバリデーションの書き方
小ネタです。
Symfonyのフォームで、FileTypeの multiple オプションを有効にして複数ファイルをアップロードできるようにしているとき、
$builder
->add('files', FileType::class, [
'label' => '添付ファイル',
'multiple' => true,
'constraints' => [
new Assert\File([
'maxSize' => '2m',
])
],
])
;
こんなふうにバリデーションを設定してしまうと上手くいきません。(ライタイムエラーになります)
正しくは、アップロードファイルの配列の各要素に対してそれぞれ個別にバリデーションする必要があるので、以下のように All
制約 を使います。
$builder
->add('files', FileType::class, [
'label' => '添付ファイル',
'multiple' => true,
'constraints' => [
new Assert\All([
new Assert\File([
'maxSize' => '2m',
])
]),
],
])
;
エンティティのアノテーションで書くならこうですね。
/**
* @Assert\All({
* @Assert\File(maxSize="2m")
* })
*/
private $files;
参考
php - Symfony validation on multiple file upload - Stack Overflow
https://stackoverflow.com/questions/46094219/symfony-validation-on-multiple-file-upload
ちなみに、複数ファイルアップロードされた際にファイルのトータルサイズでバリデーションする方法は標準では提供されていないので、自分でカスタムバリデーションを書くしかないようです。
参考
php - Symfony multiple Files total max size constraint - Stack Overflow
https://stackoverflow.com/questions/45237363/symfony-multiple-files-total-max-size-constraint
Discussion