Создайте коллекцию фотографий в форме Symfony

Я уже задавал здесь вопрос Symfony 4 - VichUploaderBundle - ввод файла не отображается, но у меня не было ответа, который мог бы мне помочь. Через несколько дней я снова испытываю удачу, потому что я все еще заблокирован.

Я получаю эту ошибку, когда пытаюсь создать коллекцию фотографий:

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

easy_admin.yml (создает коллекцию фотографий):

easy_admin:
        entities:
        FicheProduit:
            class: App\Entity\FicheProduit
                    - { property: 'photos', type: 'collection', type_options: { entry_type: 'App\Form\PhotoType', by_reference: false, allow_add: true, allow_delete: true }}

vich_uploader.yml:

vich_uploader:
    db_driver: orm
    mappings:
        fiche_produit_photo:
            uri_prefix: /images/products
            upload_destination: '%kernel.project_dir%/public/build/images/products'
            namer: vich_uploader.namer_origname
            inject_on_load: false
            delete_on_update: true
            delete_on_remove: true

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", "remove"}, orphanRemoval=true)
     *
     * @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 App\Entity\Traits\TimestampableTrait;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\HttpFoundation\File\File;
use Vich\UploaderBundle\Mapping\Annotation as Vich;

/**
 * Class Photo
 *
 * @ORM\Entity
 * @ORM\Table(name = "fiche_produit_photos")
 * @Vich\Uploadable
 * @ORM\HasLifecycleCallbacks
 *
 * @package App\Entity
 */
class Photo
{
    use TimestampableTrait;

    /**
     * @var int
     * @ORM\Column(type = "integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy = "AUTO")
     */
    protected $id;

    /**
     * @ORM\ManyToOne(targetEntity = "Photo", inversedBy = "photos")
     * @ORM\JoinColumn(nullable=false)
     *
     * @var FicheProduit
     */
    protected $ficheProduit;

    /**
     * NOTE: This is not a mapped field of entity metadata, just a simple property.
     *
     * @Vich\UploadableField(mapping = "fiche_produit_photo", fileNameProperty = "fileName", originalName = "originalName", mimeType = "mimeType", size = "size")
     *
     * @var File
     */
    protected $file;

    /**
     * @ORM\Column(name = "size", type = "integer", nullable=true)
     *
     * @var int
     */
    protected $size;

    /**
     * @ORM\Column(nullable=true)
     *
     * @var string
     */
    protected $mimeType;

    /**
     * @ORM\Column(nullable=true)
     *
     * @var string
     */
    protected $originalName;

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

    /**
     * Photo constructor
     */
    public function __construct()
    {
    }

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

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

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

    /**
     * @return int
     */
    public function getSize()
    {
        return $this->size;
    }

    /**
     * @param int $size
     */
    public function setSize($size)
    {
        $this->size = $size;
    }

    /**
     * @return string
     */
    public function getMimeType()
    {
        return $this->mimeType;
    }

    /**
     * @param string $mimeType
     */
    public function setMimeType($mimeType)
    {
        $this->mimeType = $mimeType;
    }

    /**
     * @return string
     */
    public function getOriginalName()
    {
        return $this->originalName;
    }

    /**
     * @param string $originalName
     */
    public function setOriginalName($originalName)
    {
        $this->originalName = $originalName;
    }

    /**
     * @return File
     */
    public function getFile()
    {
        return $this->file;
    }

    /**
     * @param File $file
     */
    public function setFile(File $file = null)
    {
        $this->file = $file;
        if ($file) {
            // 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 string
     */
    public function getFileName()
    {
        return $this->fileName;
    }

    /**
     * @param string $fileName
     */
    public function setFileName($fileName)
    {
        $this->fileName = $fileName;
    }
}

TimestampableTrait.php:

<?php

declare(strict_types = 1);

namespace App\Entity\Traits;

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

/**
 * Trait TimestampableTrait
 *
 * @package App\Entity\Traits
 */
trait TimestampableTrait
{
    /**
     * @var \DateTime $createdAt Created at
     *
     * @Assert\Type("\DateTime")
     *
     * @ORM\Column(type = "datetime", nullable=false)
     */
    protected $createdAt;

    /**
     * @var \DateTime $updatedAt Updated at
     *
     * @Assert\Type("\DateTime")
     *
     * @ORM\Column(type = "datetime", nullable=false)
     */
    protected $updatedAt;

    /**
     * Get created at
     *
     * @return \DateTime Created at
     */
    public function getCreatedAt()
    {
        return $this->createdAt;
    }

    /**
     * Set created at
     *
     * @param \DateTime $createdAt Created at
     *
     * @return $this
     */
    public function setCreatedAt(\DateTime $createdAt)
    {
        $this->createdAt = $createdAt;
        return $this;
    }

    /**
     * Get updated at
     *
     * @return \DateTime Updated at
     */
    public function getUpdatedAt()
    {
        return $this->updatedAt;
    }

    /**
     * Set updated at
     *
     * @param \DateTime $updatedAt Updated at
     *
     * @return $this
     */
    public function setUpdatedAt(\DateTime $updatedAt)
    {
        $this->updatedAt = $updatedAt;
        return $this;
    }

    /**
     * @ORM\PrePersist
     */
    public function prePersist()
    {
        $this->setCreatedAt(new \DateTime());
        $this->setUpdatedAt(new \DateTime());
    }

    /**
     * @ORM\PreUpdate
     */
    public function preUpdate()
    {
        $this->setUpdatedAt(new \DateTime());
    }
}

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\VichFileType;

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

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

Не нужно присылать мне официальную документацию Symfony или пакеты, которые я использую, я читал их раньше, и я также обращался к проблемам на Github. Я не нашел ничего, что могло бы решить мою проблему. : /

Здесь гений?

Я в отчаянии .. заранее большое спасибо за вашу помощь

ошибка четко указывает, что отсутствуют аргументы DI, если мы посмотрим на файл конфигурации form.xml, там добавлены все аргументы инъекции, поэтому он, вероятно, не загружен здесь VichUploaderExtension.php в строке 74. Выполните отладку и проверьте, загружен ли from.xml или нет.

Deividas Pekunas 17.07.2018 22:02

У меня возникает эта ошибка, когда я добавляю form.xml в services.yml. "Пакет" VichUploaderBundle "не существует или он не включен. Возможно, вы забыли добавить его в метод registerBundles () вашего файла App \ Kernel.php? В @ VichUploaderBundle / Resources / config / form.xml (который сейчас импортировано из "C: \ wamp64 \ www \ blh_wines \ config / services.yaml"). Убедитесь, что пакет "VichUploaderBundle / Resources / config / form.xml" правильно зарегистрирован и загружен в класс ядра приложения. зарегистрирован, убедитесь, что путь к пакету "@ VichUploaderBundle / Resources / config / form.xml" не пуст. "

ElGecko_76 17.07.2018 22:10

ваш файл ядра содержит этот пакет?

Deividas Pekunas 17.07.2018 22:18

Его там не было, я просто добавил. Но теперь у меня есть эта ошибка: InvalidConfigurationException Дочерний узел «db_driver» по пути «vich_uploader» должен быть настроен.

ElGecko_76 17.07.2018 22:20

в каком каталоге находится ваш файл vich_uploader.xml? он должен быть в config / packages / vich_uploader.yaml или app / config / config.yml

Deividas Pekunas 17.07.2018 22:29

vich_uploader.yml находится в config / packages / vich_uploader.yml

ElGecko_76 17.07.2018 22:30

Мне удалось исправить проблему, переименовав vich_uploader.yml в vich_uploader.yaml: О большое спасибо за вашу помощь

ElGecko_76 17.07.2018 22:32
Стоит ли изучать 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 и хотите разрабатывать...
2
7
243
0

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