🎻

[Symfony] フォームのFileTypeでmultipleを使っているときのバリデーションの書き方

2020/06/10に公開

小ネタです。

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

GitHubで編集を提案

Discussion