Symfony 5 $form->isSubmitted() возвращает False для загрузки файла

Я пытаюсь загрузить файл через созданный мной контроллер конечной точки API:

/**
 * @Route("/upload", methods = "POST")
 */
public function upload(Request $request)
{
    $form = $this->createForm(UserFileType::class);
    $form->handleRequest($request);

    if (!$form->isSubmitted()) {
        dd($request->files->get('file'));
    }
   ...

dd($request->files->get('file')) показывает мой файл, как и ожидалось, поэтому я не понимаю, почему isSubmitted() возвращает false, когда метод получает multipart/form-dataPOST запрос с данными. Я отправляю POST запрос через Postman. Почему форма не отправляется?

Тип файла пользователя:

class UserFileType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('file', FileType::class, [
                'mapped' => false,
                'required' => true,
                'constraints' => [
                    new File([
                        'maxSize' => '2M',
                        'mimeTypes' => [
                            'application/pdf',
                            'application/x-pdf',
                        ],
                        'maxSizeMessage' => 'The file size must not exceed {{ limit }} {{ suffix }}.',
                        'mimeTypesMessage' => 'The file type {{ type }} is not valid',
                    ])
                ],
            ]);
    }

Что такое UserFileType? Там может быть несоответствие в полях, определенных там и в вашем запросе. Либо это, либо несоответствие в методе класса формы UserFileType.

Oluwafemi Sule 22.12.2020 21:59

@OluwafemiSule, пожалуйста, смотрите редактирование, добавляющее UserFileType.

user1392897 22.12.2020 22:05

Что вы получаете, устанавливая метод формы при построении формы в UserFileType? $builder->setMethod('POST')->add('...')

Oluwafemi Sule 22.12.2020 22:29

После добавления ->setMethod('POST') в $builder и публикации файла isSubmitted по-прежнему возвращает false

user1392897 22.12.2020 22:40

Не могли бы вы проверить вывод $form->getErrors() и добавить его, если необходимо, пожалуйста.

Lounis 22.12.2020 23:25

@Lounis dd($form->getErrors()) возвращает пустое значение

user1392897 22.12.2020 23:29
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
3
6
1 393
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Для классов форм, производных от AbstractType, форма именуется с использованием fqcnToBlockPrefix , когда она создается с помощью FormFactory.

Подтвердить это можно дампом $form->getName().

Теперь реализованный метод $form->handleRequest выполняет ряд проверок через обработчик запросов перед отправкой формы.

  1. Проверяет соответствие метода методу формы
  2. Проверяет, присутствует ли имя формы в запросе, если форма имеет имя
  3. Проверяет, что хотя бы одно из полей формы заполнено, если форма не имеет названия

Ваша форма не отправляется с помощью метода обработчика запросов handleRequest, потому что поля в запросе неправильно сопоставлены с именем вашей формы.

Вы должны сопоставить имя формы в запросе HTTP POST следующим образом:

[ "user_file" =>  [ "file" => <uploaded file> ] ]

Это может оказаться не так просто в Postman. Поэтому я рекомендую реализовать вашу форму как безымянную форму вместо того, чтобы переопределить getBlockPrefix для возврата пустой строки.


class UserFileType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        //...
    }

    public function getBlockPrefix()
    {
        return '';
    }

}

Поскольку это первая ветка SO, которая подходит для ключевых слов handlerequest issubmitted false, я подумал, что поделюсь тем, что сработало для моей команды по смежной проблеме.

Мы получали false ответ при выполнении PATCH запроса. В конце концов мы поняли, что пренебрегали передачей Request::METHOD_PATCH в опции method при создании формы. Ввода тернарного оператора, устанавливающего это значение, было достаточно, чтобы решить нашу проблему.

Я надеюсь, что это помогает кому-то.

Другие вопросы по теме