Я уже задавал здесь вопрос 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. Я не нашел ничего, что могло бы решить мою проблему. : /
Здесь гений?
Я в отчаянии .. заранее большое спасибо за вашу помощь
У меня возникает эта ошибка, когда я добавляю 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" не пуст. "
ваш файл ядра содержит этот пакет?
Его там не было, я просто добавил. Но теперь у меня есть эта ошибка: InvalidConfigurationException Дочерний узел «db_driver» по пути «vich_uploader» должен быть настроен.
в каком каталоге находится ваш файл vich_uploader.xml? он должен быть в config / packages / vich_uploader.yaml или app / config / config.yml
vich_uploader.yml находится в config / packages / vich_uploader.yml
Мне удалось исправить проблему, переименовав vich_uploader.yml в vich_uploader.yaml: О большое спасибо за вашу помощь






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