php - 使用 VichUploaderBundle 和 EasyAdminBundle 上传多图像
问题描述
我在 Symfony 4 中使用 EasyAdminBundle,我想使用 VichUploaderBundle(或不使用)在我的表单中创建多个图像上传,但我找不到 Symfony 4 的任何更新文档,我不知道该怎么做这行得通。
我创建了一个 Photo 实体和一个 Product 实体,其关系为多对多单向:
产品.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 Product
*
* @package App\Entity
*
* @ORM\Entity
*/
class Product
{
/**
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
* @ORM\Column(type="integer", options={"unsigned":true}, nullable=false)
*
* @var int
*/
protected $id;
/**
* @ORM\ManyToMany(targetEntity="Photo", cascade={"persist"})
*
* @var Photo[]|ArrayCollection
*/
protected $photos;
/**
* Product constructor.
*/
public function __construct()
{
$this->photos = new ArrayCollection();
}
照片.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;
/**
* Photo
*
* @ORM\Entity()
* @Vich\Uploadable
*/
class Photo
{
/**
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*
* @var int
*/
protected $id;
/**
* @ORM\Column(name="name", type="string", length=255)
*
* @var string
*/
protected $name;
/**
* @ORM\Column(type="string", length=255)
*
* @var string
*/
protected $photo;
/**
* @Vich\UploadableField(mapping="photos", fileNameProperty="photo")
*
* @var File
*/
protected $photoFile;
/**
* @ORM\Column(type="datetime", length=255)
*
* @var \DateTime
*/
protected $updatedAt;
/**
* @return int
*/
public function getId(): ?int
{
return $this->id;
}
/**
* @param int $id
*/
public function setId(int $id): void
{
$this->id = $id;
}
/**
* @return string
*/
public function getName(): ?string
{
return $this->name;
}
/**
* @param string $name
*/
public function setName(string $name): void
{
$this->name = $name;
}
/**
* @param File|null $photo
* @return Photo
*/
public function setPhotoFile(File $photo = null)
{
$this->photoFile = $photo;
if ($photo) {
$this->updatedAt = new \DateTime('now');
}
return $this;
}
/**
* @return File
*/
public function getPhotoFile() : ?File
{
return $this->photoFile;
}
/**
* @param string $photo
* @return Photo
*/
public function setPhoto($photo)
{
$this->photo = $photo;
return $this;
}
/**
* @return string
*/
public function getPhoto() : ?string
{
return $this->photo;
}
}
vich_uploader.yaml 文件:
vich_uploader:
db_driver: orm
mappings:
photos:
uri_prefix: "/products/"
upload_destination: '%kernel.root_dir%/../public/build/images/products/'
namer: vich_uploader.namer_uniqid
easy_admin.yaml :
easy_admin:
entities:
Product:
class: App\Entity\Product
form:
fields:
- { property: 'photos', type: 'collection', type_options: { entry_type: 'App\Form\PhotoType' } }
照片类型.php:
<?php
declare(strict_types = 1);
namespace App\Form;
use App\Entity\Product;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\CollectionType;
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('name')
->add('photos', CollectionType::class, ['entry_type' => VichFileType::class])
;
}
/**
* @param OptionsResolver $resolver
*/
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => Photo::class,
]);
}
}
解决方案
推荐阅读
- javascript - 用监听器更新谷歌地图标记图标
- r - 模拟超出内存
- javascript - Angular - 可观察的检查值是否存在
- python - 从列表中填充字典的最快方法?
- c++ - 如何在 C++ 中执行命令并获取命令的返回码 stdout 和 stderr
- android - 图像不会变得不可见
- node.js - Bot 框架 Directline - 使用 node.js 更改 Bot 名称运行时
- node.js - Node.js 中的 setTimeout()
- css - 如何替换显示:浏览器边缘中的内容
- lua - 如何解码这个lua脚本代码?我不明白第七行的函数编码中的内容