Ошибка при рендеринге формы редактирования Symfony 4, которая включает тип файла

Я следую шагам, описанным в этой документации https://symfony.com/doc/current/controller/upload_file.html, чтобы разрешить загрузку файла. Он отлично работает для добавления нового элемента, но когда я пытаюсь отредактировать свою сущность, я получаю следующую ошибку:

Ожидается, что данные представления формы будут экземпляром класса Symfony\Component\HttpFoundation\File\File, но представляют собой (n) строку. Вы можете избежать этой ошибки, установив для параметра "data_class" значение null или добавив преобразователь представления, который преобразует строку (n) в экземпляр Symfony\Component\HttpFoundation\File\File.

Я пробовал код, подобный тому, который предлагается в этой статье, чтобы добавить путь к папке как тип файла к объекту, подобному этому, в моем методе обновления:

public function editAction(Request $request, Advertiser $advertiser)
{

    $advertiser->setLogo(
        new File($this->getParameter('logo_directory') .'/' . $advertiser->getLogo())
    );

    $editForm = $this->createForm(AdvertiserType::class, $advertiser);

    $editForm->handleRequest($request);
    if ($editForm->isSubmitted() && $editForm->isValid()) {
        $this->getDoctrine()->getManager()->flush();
        return $this->redirectToRoute('advertiser_list');
    }
    return $this->render('advertiser/index.html.twig', [
        'form' => $editForm->createView()
    ]);
}

Параметр logo_directory правильно определен (и отлично работает для создания новых сущностей).

Пожалуйста, дайте мне знать, если у вас есть идеи, что я делаю неправильно.

Спасибо за помощь.

ОБНОВЛЕНИЕ: В этой статье Ожидается, что данные представления формы будут экземпляром класса... но это (n) строка предлагается решение для включения в код построителя форм следующего:

->add('file', FileType::class, array('data_class' => null))

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

->add('logo', FileType::class, array('data_class' => null), ['label' => 'Logo (JPG or PNG file)'])

Любые мысли о том, как это можно изменить, чтобы форма отображалась с предварительно заполненным предыдущим выбором?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Symfony Station Communiqué - 17 февраля 2023 г
Symfony Station Communiqué - 17 февраля 2023 г
Это коммюнике первоначально появилось на Symfony Station , вашем источнике передовых новостей Symfony, PHP и кибербезопасности.
Управление ответами api для исключений на Symfony с помощью KernelEvents
Управление ответами api для исключений на Symfony с помощью KernelEvents
Много раз при создании api нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
2
0
1 309
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Установка нулевого значения data_class удалит предупреждение, но оно не будет работать, на данный момент оно вам не нужно.

Это связано с тем, что после сохранения файла в базе данных остается только путь, а не сам файл (который на диске);

Если вы хотите снова отредактировать этот объект, путь (строка) должен быть снова преобразован в объект Файл; Вот что говорит сообщение об ошибке.

.. и это то, что вы сделали, когда написали:

$advertiser->setLogo(
    new File($this->getParameter('logo_directory') .'/' . $advertiser->getLogo())
);

Теперь остается проблема в том, что вы хотите предварительно заполнить поле файла. На самом деле это невозможно, так как поле файла указывает на местоположение на вашем собственном компьютере, а не на файл на вашем сервере (и вы не можете автоматически загружать что-то с чьего-то компьютера вот так, это было бы очень опасно).

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

Итак, в вашем шаблоне Twig что-то вроде этого (изменить с вашим реальным каталогом логотипа):

{% if form.logo.vars.data %}
  <img src = "{{ asset('/uploads/logos_directory/' ~ form.logo.vars.data.filename) }}"/>
{% endif %}

Надеюсь понятно.

Спасибо за подробное описание, tchap!

Erich 11.02.2019 21:27

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