Как проверить имя загруженного файла в Symfony формах - PullRequest
1 голос
/ 24 апреля 2020

Вот мои входные «термины» в компоновщике из FormUploaderType

    ->add('terms', FileType::class, [
        'constraints'   => [
            'pattern'   => '/([a-z]+-)+[20]\d{7}\.pdf/',
            'message'   => 'Change the name of the file',
            'mimeTypes' => [
                "application/pdf",
                "application/x-pdf",
            ],
    ])

Я хочу быть уверен, что имя файла точно такое, как я хочу (например:'thing-else-in- here-20200430.pdf '), но он не работает - он показывает мне сообщение об ошибке ... Как мне с этим справиться? Я видел метод Annotation из symfony документации, а также метод loadValidatorMetadata в объекте класса, но ни один из них, похоже, не работает для меня с загрузкой файла ...

1 Ответ

0 голосов
/ 24 апреля 2020

Вам нужно создать экземпляр ограничений. Клавиша mimeTypes соответствует ограничению File, а pattern - Regex.

Однако, поскольку terms является UploadedFile, его метод __toString() вернет временное загруженное имя файла, и проверка не будет выполнена. Вместо этого вам нужно будет использовать Callback, чтобы получить доступ к объекту.

->add('terms', FileType::class, [
    'constraints'   => [
        new Callback(function ($object, ExecutionContextInterface $context, $payload) {
            $pattern = '/^([a-z]+-)+-20\d{6}\.pdf$/';
            if (!preg_match($pattern, $object->getClientOriginalName())) {
                $context->buildViolation('Change the name of the file')
                    ->addViolation();
            }
        }),
        new File([
            'mimeTypes' => [
                "application/pdf",
                "application/x-pdf",
            ],
        ]),
])
...