【发布时间】:2022-01-19 16:23:42
【问题描述】:
当我想用 symfony 编辑表单中的“事件”时出现此错误:
“表单的视图数据应该是“Symfony\Component\HttpFoundation\File\File”,但它是一个“字符串”。您可以通过将“data_class”选项设置为 null 或添加将“字符串”转换为“Symfony\Component\HttpFoundation\File\File”实例的视图转换器。”
我遵循文档并将其添加到我的控制器中:
$event->setEventImage(
new File($this->getParameter('images_dir').'/'.$event->getEventImage())
);
但它并没有改变什么,我不明白为什么。
所以有我的实体:
/**
*
* @ORM\Column (type="string")
* @Assert\NotBlank(message="Merci de charger un fichier au format image.")
* @Assert\File(mimeTypes={ "image/*" })
*/
private $eventImage;
public function getEventImage(): ?string
{
return $this->eventImage;
}
public function setEventImage(string $eventImage): self
{
$this->eventImage = $eventImage;
return $this;
}
还有我的控制器:
#[Route('/{id}/edit', name: 'events_edit', methods: ['GET','POST'])]
public function edit(Request $request, Events $event, SluggerInterface $slugger): Response
{
$event->setEventImage(
new File($this->getParameter('images_dir').'/'.$event->getEventImage())
);
$form = $this->createForm(EventsType::class, $event);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
/** @var UploadedFile $eventImage */
$eventImage = $form->get('eventImage')->getData();
// this condition is needed because the 'eventImage' field is not required
// so the Image file must be processed only when a file is uploaded
if ($eventImage) {
$originalFilename = pathinfo($eventImage->getClientOriginalName(), PATHINFO_FILENAME);
// this is needed to safely include the file name as part of the URL
$safeFilename = $slugger->slug($originalFilename);
$newFilename = $safeFilename . '-' . uniqid() . '.' . $eventImage->guessExtension();
// Move the file to the directory where images are stored
try {
$eventImage->move(
$this->getParameter('images_dir'),
$newFilename
);
} catch (FileException $e) {
// ... handle exception if something happens during file upload
}
// updates the 'eventImage' property to store the image file name
// instead of its contents
$event->setEventImage($newFilename);
}
$this->getDoctrine()->getManager()->flush();
return $this->redirectToRoute('events_index', [], Response::HTTP_SEE_OTHER);
}
return $this->renderForm('events/edit.html.twig', [
'event' => $event,
'form' => $form,
]);
}
还有我的 EventsType :
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$builder
->add('title')
->add('subtitle')
->add('content', CKEditorType::class, [
'label' => 'content',
'required' => false,
])
->add('dateEvent', DateTimeType::class, [
'widget' => 'single_text',
'label' => 'Date d\'arrivée : '
])
->add('place')
->add('dateDead', DateType::class, [
'widget' => 'single_text',
'label' => 'Date limite d\'inscription : '
])
->add('numberPersonRestricted')
->add('eventImage', FileType::class, [
'label' => 'Image (fichier image)',
'required' => false,
'constraints' => [
new File([
'maxSize' => '1024k',
'mimeTypes' => [
'image/*',
],
'mimeTypesMessage' => 'Please upload a valid image',
])
]
])
;
}
public function configureOptions(OptionsResolver $resolver): void
{
$resolver->setDefaults([
'data_class' => Events::class,
]);
}
【问题讨论】: