Я пытаюсь разрешить множественную загрузку с помощью пакета VichUploader. В проекте у меня есть класс Theater, у которого есть главное изображение, а также несколько вторичных изображений (Коллекция изображений). На самом деле каждое вторичное изображение является Ressource.
Таким образом, Театр имеет множество ресурсов, а Ресурс связан с одним театром.
Но когда я пытаюсь создать, я могу получить доступ к своей форме, но у меня появляется ошибка, когда я пытаюсь сохранить:
Expected argument of type "AppBundle\Entity\Resources", "AppBundle\Entity\Theatre" given
Вот мой класс Театр с подробной информацией для многократной загрузки:
namespace AppBundle\Entity;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\HttpFoundation\File\File;
use Symfony\Component\HttpFoundation\File\UploadedFile;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Validator\Context\ExecutionContextInterface;
use Vich\UploaderBundle\Mapping\Annotation as Vich;
/**
* Theatre
*
* @ORM\Table(name="theatre")
* @ORM\Entity
* @Vich\Uploadable
*/
class Theatre
{
/**
* @var ArrayCollection
* @ORM\OneToMany(targetEntity="Resources", mappedBy="theatre", cascade={"persist", "remove"}, orphanRemoval=true)
*/
private $images;
// ..
/**
* Constructor
*/
public function __construct()
{
$this->images = new \Doctrine\Common\Collections\ArrayCollection();
}
// MultiUpload
/**
* @return ArrayCollection
*/
public function getImages()
{
return $this->images;
}
/**
* @param ArrayCollection $pictures
*/
public function setImages($pictures)
{
$this->images = $pictures;
}
public function getAttachImages()
{
return null;
}
/**
* @param array $files
*
* @return array
*/
public function setAttachImages(array $files=array())
{
if (!$files) return [];
foreach ($files as $file) {
if (!$file) return [];
$this->attachImages($file);
}
return [];
}
/**
* @param UploadedFile|null $file
*/
public function attachImages(UploadedFile $file=null)
{
if (!$file) {
return;
}
$picture = new Resources();
$picture->setImage($file);
$this->addImage($picture);
}
/**
* Add image.
*
* @param \AppBundle\Entity\Resources $image
*
*
*/
public function addImage(\AppBundle\Entity\Resources $image)
{
$image->setTheatre($this);
//$this->images->add($image);
$this->images[] = $image;
//return $this;
}
/**
* Remove image.
*
* @param \AppBundle\Entity\Resources $image
*
*
*/
public function removeImage(\AppBundle\Entity\Resources $image)
{
$image->setTheatre(null);
$this->images->removeElement($image);
// return $this->images->removeElement($image);
}
Тогда мой класс Ресурсы:
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\HttpFoundation\File\File;
use Symfony\Component\HttpFoundation\File\UploadedFile;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Validator\Context\ExecutionContextInterface;
use Vich\UploaderBundle\Mapping\Annotation as Vich;
/**
* Resources
*
* @ORM\Table(name="resources")
* @ORM\Entity
* @Vich\Uploadable
*/
class Resources
{
/**
* @var Theatre
* @ORM\ManyToOne(targetEntity="Theatre", inversedBy="images")
*/
private $theatre;
/**
* @Vich\UploadableField(mapping="uploads_image", fileNameProperty="url")
* @Assert\File(
* mimeTypes = {"image/png", "image/jpeg", "image/jpg"},
* mimeTypesMessage = "Please upload a valid valid IMAGE"
* )
*
*
* @var File $image
*/
protected $image;
/**
* @ORM\Column(type="string", length=255, name="url")
*
* @var array $url
*/
protected $url;
/**
*
* @param File|\Symfony\Component\HttpFoundation\File\UploadedFile $image
*
* @return Theatre
*/
public function setImage(File $image = null)
{
$this->image = $image;
}
public function getImage()
{
return $this->image;
}
// ..
/**
* Set theatre.
*
* @param \AppBundle\Entity\Theatre $theatre
*
* @return Resources
*/
public function setTheatre(\AppBundle\Entity\Theatre $theatre)
{
$this->theatre = $theatre;
return $this;
}
/**
* Get theatre.
*
* @return \AppBundle\Entity\Theatre
*/
public function getTheatre()
{
return $this->theatre;
}
/**
* Set url.
*
* @param string $url
*
* @return Resources
*/
public function setUrl($url)
{
$this->url = $url;
return $this;
}
/**
* Get url.
*
* @return array
*/
public function getUrl()
{
return $this->url;
}
Затем добавляю к строителю:
namespace AppBundle\Form\Collection;
use AppBundle\Entity\Theatre;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\FileType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Vich\UploaderBundle\Form\Type\VichFileType;
class TheatreImages extends AbstractType{
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('attachImages', FileType::class, ['multiple'=>true, 'required'=>false])
;
}
/**
* @param OptionsResolver $resolver
*/
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => Theatre::class,
));
}
/**
* @return string
*/
public function getName()
{
return 'app_theatreImages';
}
}
Я добавляю свой конфиг с помощью пакета easyAdminBundle:
easy_admin:
entities:
Theatre:
class: AppBundle\Entity\Theatre
list:
title: 'Liste des théâtres'
fields:
- 'Name'
- 'adress'
- 'Metro station'
- { property: 'Main image', type: 'image', template: 'theatreFile.html.twig', base_path: '%app.path.theatre_images%' }
new:
title: 'Création théâtre'
fields:
- { type: 'section', label: 'Information du théâtre' }
- {property: 'name', label: 'Nom'}
- {property: 'number_of_seats', type: 'integer', label: 'Nombre de sièges'}
- {property: 'about', label: 'description'}
- { property: 'imageFile', type: 'vich_file', label: 'image', type_options: { required: false}}
- {property: 'images', type: 'collection', type_options: {entry_type: 'AppBundle\Form\Collection\TheatreImages', by_reference: false}}
- { type: 'section', label: 'Localisation du théâtre' }
- {property: 'adress', label: 'adresse'}
- {property: 'metro_station', label: 'Station de métro'}
- {property: 'location_coordinates', label: 'Coordonnées'}
edit:
title: "Édition théâtre"
fields:
- { type: 'section', label: 'Information du théâtre' }
- {property: 'name', label: 'Nom'}
- {property: 'number_of_seats', type: 'integer', label: 'Nombre de sièges'}
- {property: 'about', label: 'description'}
- { property: 'imageFile', type: 'vich_file', label: 'image', type_options: { required: false}}
- {property: 'images', type: 'collection', type_options: {entry_type: 'AppBundle\Form\Collection\TheatreImages', by_reference: false}}
- { type: 'section', label: 'Localisation du théâtre' }
- {property: 'adress', label: 'adresse'}
- {property: 'metro_station', label: 'Station de métro'}
- {property: 'location_coordinates', label: 'Coordonnées'}
Заранее спасибо.