Я следую шагам, описанным в этой документации 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)'])
Любые мысли о том, как это можно изменить, чтобы форма отображалась с предварительно заполненным предыдущим выбором?




Установка нулевого значения 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!