我有一个基于Symfony 4的事件管理软件。我一直在使用Vich Uploader来毫无问题地处理事件的特色图像。现在,我想使用名为EventImage的相关实体添加更多事件图像,该实体可能具有不同的图像类型(功能,背景或图库)。
因此,EventImage实体现在具有一个相关事件和一个imageType:
// EventImage.php
// imageType possible types
const IMAGE_TYPE_FEATURED = 0;
const IMAGE_TYPE_BACKGROUND = 1;
const IMAGE_TYPE_GALLERY = 2;
...
/**
* @ORM\Column(type="string", length=255)
*/
private $image;
/**
* Service image
*
* @Assert\File(
* maxSize = "1024k",
* mimeTypes = {"image/jpeg", "image/jpeg", "image/png"}
* )
* @Vich\UploadableField(mapping="event_image", fileNameProperty="image")
*
* @var File
*/
private $imageFile;
/**
* @ORM\Column(type="integer")
*/
private $imageType;
...
/**
* @ORM\ManyToOne(targetEntity="App\Entity\Event", inversedBy="eventImages")
* @ORM\JoinColumn(nullable=false)
*/
private $event;
...
我的事件实体现在也具有图像集合:
//Event.php
/**
* @ORM\OneToMany(targetEntity="App\Entity\EventImage", mappedBy="event", orphanRemoval=true)
*/
private $eventImages;
在表单上,我以前没有问题地使用过VichFileType类,因为Event实体曾经直接在其中包含一个uploadable字段。
$builder->add('featuredImage', VichFileType::class, [
'download_uri' => true,
'label' => 'Image',
]
);
但是现在,我要处理该事件的所有事件图像,并用Featured Image,BackgroundImage和一组Gallery Images分隔。
我不知道该如何实现。我已经将getFeaturedImage方法设置为Event实体(以及其他图像):
public function getFeaturedImage(): EventImage
{
/** @var EventImage $image */
foreach ($this->getEventImages() as $image){
if($image->getImageType() === EventImage::IMAGE_TYPE_FEATURED){
return $image;
}
}
return $image;
}
但是在加载表单时,出现此错误:
“ App \ Entity \ Event”类不可上传。如果使用批注来配置VichUploaderBundle,您可能只是忘记在实体顶部添加@Vich\Uploadable
。
那是正常的,因为现在Event实体将不保存图像,但是我仍然需要将事件传递给表单,以便可以访问相关图像。
传递信息的控制器方法是:
/**
* @Route("/organizer/event/{id}/design", name="organizer_event_design")
* @IsGranted("MANAGE_EVENTS", subject="event")
* @param int $id
* @param EventRepository $repository
* @param Request $request
* @param EntityManagerInterface $entityManager
* @return \Symfony\Component\HttpFoundation\RedirectResponse|Response
*/
public function design(Event $event, EventRepository $repository, Request $request, EntityManagerInterface $entityManager)
{
$form = $this->createForm(EventDesignFormType::class, $event);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
/** @var User $user */
$user = $this->getUser();
$event->setUpdatedBy($user->getEmail());
$entityManager->persist($event);
$entityManager->flush();
$this->addFlash('success', 'Event Updated!');
return $this->redirectToRoute('organizer_event_edit', [
'id' => $event->getId(),
'tags' => $event->getTags()->toArray()
]);
}
return $this->render('organizer/event_admin/design.html.twig', [
'eventForm' => $form->createView(),
'event' => $event,
]);
}
我使用的是完全错误的方法吗?
对不起,很长的帖子,谢谢您的帮助!