【问题标题】:VichUploader: reupload image on entity updateVichUploader:在实体更新时重新上传图片
【发布时间】:2018-02-12 16:18:37
【问题描述】:

我有带有字段图像的实体Asset

 /**
  * @ORM\Table(name="asset")
  * @ORM\Entity(repositoryClass="AppBundle\Repository\AssetRepository")
  * @Vich\Uploadable
  */
 class Asset
 {

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

     /**
      * @ORM\ManyToOne(targetEntity="Category", inversedBy="assets")
      * @ORM\JoinColumn(name="category_id", referencedColumnName="id")
      */
     private $category;

     /**
      * @ORM\Column(name="image", type="string", length=255, nullable=true)
      */
     private $image;

     /**
      * @Vich\UploadableField(mapping="assets", fileNameProperty="image")
      * @var File
      */
     protected $imageFile;

我正在使用 VichUploader 将图像上传到 S3 存储桶。我创建了自定义命名器来创建文件名。在上传过程中,实体以类别名称上传到文件夹,并以实体名称命名

public function name($obj, PropertyMapping $mapping)
{
    $category = $obj->getCategory()->getName();
    $name = $obj->getName();
    $file = $mapping->getFile($obj);

    if ($extension = $this->getExtension($file)) {
        $name = sprintf('%s.%s', $name, $extension);
    }

    return $category.'/'.$name;
}

这些我的上传配置

oneup_flysystem:
adapters:
    assets_adapter:
        awss3v3:
            client: app.assets.s3
            bucket: '%assets_bucket%'
            prefix: assets

filesystems:
    assets_fs:
        adapter:    assets_adapter
        mount:      assets_fs

vich_uploader:
     db_driver: orm
     storage:   flysystem

mappings:
    assets:
        delete_on_remove: true
        delete_on_update: true
        uri_prefix:       'https://s3-%assets_region%.amazonaws.com/%assets_bucket%/'
        upload_destination: assets_fs
        namer: app.asset_namer

我有以下情况:用户更改资产类别。如何将文件重新上传到新的类别文件夹并更新名称?

更新

我正在使用EasyAdminBundle。它处理创建和编辑实体。所以我没有为 Asset 实体创建 FormType 和 Controller。以下是配置:

easy_admin:
  entities:
   Asset:
    class: AppBundle\Entity\Asset
    label: 'Assets'
    form:
      fields:
        - name
        - {property: 'category', type: entity, type_options: {expanded: false, multiple: false, class: 'AppBundle:Category', required: true}}
        - {property: 'imageFile', type: 'vich_image' }

【问题讨论】:

  • 请显示更新 Controller 和 FormType 对象代码,因为这是模型被操纵的地方。在那张纸条上;我会为类别名称更改添加一个条件,使用新的File 对象从getImageFile 重新创建现有的文件对象,并使用新的File 对象调用setImageFile()。这将强制 VichUploader 更新过程。

标签: php symfony vichuploaderbundle


【解决方案1】:

一种解决方案是更新Asset::setCategory 方法逻辑,在更改类别名称时创建一个新的文件对象,并将其传递给Asset::setImageFile 以使VichUploader 运行更新过程。

use Symfony\Component\HttpFoundation\File\UploadedFile;

/**
 * @ORM\Table(name="asset")
 * @ORM\Entity(repositoryClass="AppBundle\Repository\AssetRepository")
 * @Vich\Uploadable
 */
class Asset
{
     //...

     public function setCategory(Category $category)  
     {
         if ($this->imageFile && $this->category->getName() !== $category->getName()) {
             $this->setImageFile(new UploadedFile(
                 $this->imageFile->getRealPath(),  //physical path to image file
                 $this->image, //current image name
                 null, 
                 null, 
                 null, 
                 true
             ));
         }
         $this->category = $category;

         return $this;
     }

}

一个问题是默认情况下 VichUploader 不填充实体 imageFile 属性。

为确保Asset::$imageFile 可用,而无需与vich_uploader.storage 服务交互,您需要将inject_on_load: true 添加到您的vich_uploader.mappings 设置中。这将为实体添加一个侦听器,以使用 File 对象自动填充 imageFile 属性。

#app/config/config.yml

#...

vich_uploader:
    db_driver: orm
    storage: flysystem
    mappings:
        assets:
            delete_on_remove: true
            delete_on_update: true
            uri_prefix: 'https://s3-%assets_region%.amazonaws.com/%assets_bucket%/'
            upload_destination: assets_fs
            namer: app.asset_namer
            inject_on_load: true

首选方法是将逻辑添加到您的controller edit action,或者将custom event subscriber 添加到监控资产实体的 Symfony 事件中。尽管我不知道如何针对 EasyAdminBundle 中的类别名称更改来完成此操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-07
    • 1970-01-01
    • 2011-07-08
    • 2020-11-23
    • 2018-07-12
    • 1970-01-01
    • 2013-09-11
    • 2016-08-08
    相关资源
    最近更新 更多