Symfony 4 - VichUploaderBundle - ввод файла не отображается

У меня есть сущность «FicheProduit» в отношении OneToMany с моей сущностью «Фотография», потому что в описании продукта может быть несколько фотографий. В своей форме я хотел бы создать несколько загрузок через VichUploaderBundle, но получаю такую ​​ошибку:

Too few arguments to function Vich\UploaderBundle\Form\Type\VichImageType::__construct(), 0 passed in C:\wamp64\www\blh_wines\vendor\symfony\form\FormRegistry.php on line 92 and at least 3 expected

FicheProduit.php:

<?php

declare(strict_types = 1);

namespace App\Entity;

use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;

/**
 * Class FicheProduit
 * 
 * @package App\Entity
 *
 * @ORM\Entity
 */
class FicheProduit
{
    /**
     * @ORM\Id
     * @ORM\GeneratedValue(strategy = "AUTO")
     * @ORM\Column(type = "integer", options = {"unsigned":true}, nullable=false)
     *
     * @var int
     */
    protected $id;

    /**
     * @ORM\OneToMany(targetEntity = "Photo", mappedBy = "ficheProduit", cascade = {"persist"})
     *
     * @Assert\Valid()
     *
     * @var Photo[]|ArrayCollection
     */
    protected $photos;

    /**
     * FicheProduit constructor.
     */
    public function __construct()
    {
        $this->photos = new ArrayCollection();
    }

    /**
     * @return int
     */
    public function getId(): ?int
    {
        return $this->id;
    }

    /**
     * @param int $id
     */
    public function setId(int $id): void
    {
        $this->id = $id;
    }

    /**
     * @return Photo[]|ArrayCollection
     */
    public function getPhotos()
    {
        return $this->photos;
    }

    /**
     * @param Photo[]|ArrayCollection $photos
     */
    public function setPhotos($photos): void
    {
        $this->photos = $photos;
    }

    /**
     * Add photo
     *
     * @param Photo $photo
     *
     * @return FicheProduit
     */
    public function addPhoto(Photo $photo)
    {
        $photo->setProduct($this);
        $this->photos[] = $photo;

        return $this;
    }

    /**
     * Remove photo
     *
     * @param Photo $photo
     */
    public function removePhoto(Photo $photo)
    {
        $this->photos->removeElement($photo);
    }
}

Photo.php

<?php

declare(strict_types = 1);

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\HttpFoundation\File\File;
use Vich\UploaderBundle\Mapping\Annotation as Vich;

/**
 * @ORM\Entity
 * @Vich\Uploadable
 */
class Photo
{
    /**
     * @ORM\Id
     * @ORM\Column(type = "integer")
     * @ORM\GeneratedValue(strategy = "AUTO")
     */
    protected $id;

    /**
     * @Vich\UploadableField(mapping = "fiche_produit_photo", fileNameProperty = "imageName", size = "imageSize")
     *
     * @var File
     */
    protected $imageFile;

    /**
     * @ORM\Column(type = "string", length=255)
     *
     * @var string
     */
    protected $imageName;

    /**
     * @ORM\Column(type = "integer")
     *
     * @var integer
     */
    protected $imageSize;

    /**
     * @ORM\Column(type = "datetime")
     *
     * @var \DateTime
     */
    protected $updatedAt;

    /**
     * @ORM\ManyToOne(targetEntity = "FicheProduit", inversedBy = "photos")
     */
    protected $ficheProduit;

    /**
     * If manually uploading a file (i.e. not using Symfony Form) ensure an instance
     * of 'UploadedFile' is injected into this setter to trigger the  update. If this
     * bundle's configuration parameter 'inject_on_load' is set to 'true' this setter
     * must be able to accept an instance of 'File' as the bundle will inject one here
     * during Doctrine hydration.
     *
     * @param File|\Symfony\Component\HttpFoundation\File\UploadedFile $image
     */
    public function setImageFile(?File $image = null): void
    {
        $this->imageFile = $image;

        if (null !== $image) {
            // It is required that at least one field changes if you are using doctrine
            // otherwise the event listeners won't be called and the file is lost
            $this->updatedAt = new \DateTimeImmutable();
        }
    }

    /**
     * @return null|File
     */
    public function getImageFile(): ?File
    {
        return $this->imageFile;
    }

    /**
     * @param null|string $imageName
     */
    public function setImageName(?string $imageName): void
    {
        $this->imageName = $imageName;
    }

    /**
     * @return null|string
     */
    public function getImageName(): ?string
    {
        return $this->imageName;
    }

    /**
     * @param int|null $imageSize
     */
    public function setImageSize(?int $imageSize): void
    {
        $this->imageSize = $imageSize;
    }

    /**
     * @return int|null
     */
    public function getImageSize(): ?int
    {
        return $this->imageSize;
    }

    /**
     * @return mixed
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * @param mixed $id
     */
    public function setId($id): void
    {
        $this->id = $id;
    }

    /**
     * @return \DateTime
     */
    public function getUpdatedAt(): ?\DateTime
    {
        return $this->updatedAt;
    }

    /**
     * @param \DateTime $updatedAt
     */
    public function setUpdatedAt(\DateTime $updatedAt): void
    {
        $this->updatedAt = $updatedAt;
    }

    /**
     * @return mixed
     */
    public function getFicheProduit()
    {
        return $this->ficheProduit;
    }

    /**
     * @param mixed $ficheProduit
     */
    public function setFicheProduit($ficheProduit): void
    {
        $this->ficheProduit = $ficheProduit;
    }
}

vich_uploader.yaml:

vich_uploader:
db_driver: orm
mappings:
    fiche_produit_photo:
        uri_prefix: /images/products
        upload_destination: '%kernel.project_dir%/public/images/products'

        inject_on_load: false
        delete_on_update: true
        delete_on_remove: true

easy_admin.yaml:

easy_admin:
    entities:
        FicheProduit:
            class: App\Entity\FicheProduit
            list:
                title: 'Fiche produit'
            form:
                title: 'Ajouter une fiche produit'
                fields:
                    - { property: 'photos', type: 'collection', type_options: { entry_type: 'App\Form\PhotoType', by_reference: false }}

PhotoType.php:

<?php

declare(strict_types = 1);

namespace App\Form;

use App\Entity\Photo;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Vich\UploaderBundle\Form\Type\VichImageType;

/**
 * Class PhotoType
 *
 * @package App\Form
 */
class PhotoType extends AbstractType
{
    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('imageName')
            ->add('imageFile', VichImageType::class, [
                'required' => false,
                'allow_delete' => true,
                'download_label' => '...',
                'download_uri' => true,
                'image_uri' => true,
                'imagine_pattern' => '...',
            ])
        ;
    }

    /**
     * @param OptionsResolver $resolver
     */
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => Photo::class,
        ]);
    }
}

Я попытался заменить это:

->add('imageFile', VichImageType::class, [
                    'required' => false,
                    'allow_delete' => true,
                    'download_label' => '...',
                    'download_uri' => true,
                    'image_uri' => true,
                    'imagine_pattern' => '...',
                ])

Этим :

->add('imageFile', CollectionType::class, ['entry_type' => VichImageType::class])

У меня больше нет ошибок, но мой вводимый файл не отображается, и рядом с ним стоит «0».

Symfony 4 - VichUploaderBundle - ввод файла не отображается

Я следил за этой документацией, но это мне не очень помогло:

https://github.com/dustin10/VichUploaderBundle/blob/master/Resources/doc/form/vich_image_type.md

https://github.com/dustin10/VichUploaderBundle/blob/master/Resources/doc/usage.md

Вы проверяли документацию по easy admin + VichUploader? symfony.com/doc/master/bundles/EasyAdminBundle/integration/…

Jeroen 14.07.2018 19:57

Да, но решения нет .. Поняли?

ElGecko_76 16.07.2018 22:55
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
2
3 381
1

Ответы 1

Ну, я никогда не использовал EasyAdmin, но я думаю, что вам нужно определение администратора для объекта Photo:

easy_admin:
    entities:
         Photo:
            # ...
            form:
                fields:
                    - { property: 'imageFile', type: 'vich_image' }

Я думаю, вам не нужен PhotoType formType для интерфейса EasyAdmin.

Если вы последуете этому руководству: https://symfony.com/doc/master/bundles/EasyAdminBundle/integration/vichuploaderbundle.html#uploading-the-images-in-the-edit-and-new-views Вы увидите, что в примере нет FormType.

Другие вопросы по теме