如何使用Vich Uploader生成图像?

时间:2019-04-01 11:40:25

标签: symfony symfony-forms symfony4 vichuploaderbundle

我有一个基于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,


    ]);
}

我使用的是完全错误的方法吗?

对不起,很长的帖子,谢谢您的帮助!

0 个答案:

没有答案