Как использовать Vich Uploader для реализованных изображений? - PullRequest
0 голосов
/ 01 апреля 2019

У меня есть программное обеспечение для управления событиями, построенное на 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;

...

У сущности My Event теперь также есть коллекция изображений:

//Event.php

/**
     * @ORM\OneToMany(targetEntity="App\Entity\EventImage", mappedBy="event", orphanRemoval=true)
     */
    private $eventImages;

В форме я ранее без проблем использовал класс VichFileType, поскольку у сущности Event раньше было загружаемое поле.

$builder->add('featuredImage', VichFileType::class, [
                'download_uri' => true,
                'label' => 'Image',

            ]
        );

Но теперь я хочу обработать все изображения событий для этого события, разделенные Избранным изображением, BackgroundImage и набором изображений Галереи.

Понятия не имею, как этого добиться. Я уже настроил метод 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,


    ]);
}

Я использую совершенно неправильный подход?

Извините за длинный пост и спасибо за помощь!

...