首页 > 解决方案 > 使用 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,
        ]);
    }
}

结果

标签: phpsymfonyimage-uploadingvichuploaderbundle

解决方案


推荐阅读