Intro

我正在开发一个Symfony 4应用程序,它允许用户创建和编辑与单个或多个图像相关的帖子 . 数据通过Doctrine存储到数据库中 . 每个Post都有关联的PostImage实体,其中包含实际图像文件的文件名 .

发布实体:

/**
 * @ORM\Entity
 */
class Post
{
    ...

    /**
     * @ORM\OneToMany(targetEntity="PostImage", mappedBy="post", cascade={"persist", "remove"}, orphanRemoval=true)
     */
    private $images;

   ...

PostImage实体:

/**
 * @ORM\Entity
 */
class PostImage
{

    ...
    /**
    * @ORM\ManyToOne(targetEntity="Post")
    */
    private $post;

    /**
     * @ORM\Column(type="string", length=512)
     */
    private $filename;

    ...

What I am trying to do

基本文件上传到db的良好描述是here . 但是我想让图片上传和预览更具动感 .

用户应该能够:

  • 上传单张/多张图片并预览

  • 上传更多图片

  • 删除一些图像

  • 如果删除所有图像,则无法提交表单

  • 稍后使用相同的表格编辑帖子(即执行上述步骤)

Where I struggle

上面的JavaScript / DOM操作方面对我来说非常清楚 . 我奋斗的地方是如何在Symfony方面构建表单或修改类型 . "$images" Post实体的字段是一个集合,Symfony使用带有集合的表单的方式被描述为here . 但我正在努力了解如何修改此逻辑以使用文件 .

如果我使用未映射的FileType控件并通过AJAX上传文件,我如何存储和提交代表当前图像列表的链接(有些可能是新的,有些 - 旧的,有些 - 已删除)?将CollectionType控件与HiddenType子项一起使用,其中包含对服务器上传文件的引用?

class PostType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('images', CollectionType::class, array(
                'allow_add' => true,
                'allow_remove' => true,
                'by_reference' => false,
                'entry_type' => HiddenType::class
                ))
            ->add('add_images', FileType::class, array(
                'label' => 'Add images',
                'mapped' => false,
                'multiple' => true
                ))
            ->add( //other fields..
            ...
     }
}