Sonata Admin + Vich Upload 加载时注入不起作用

Posted

技术标签:

【中文标题】Sonata Admin + Vich Upload 加载时注入不起作用【英文标题】:Sonata Admin + Vich Upload inject on load not working 【发布时间】:2016-06-09 17:31:19 【问题描述】:

我正在通过奏鸣曲管理员使用 vich 上传,我可以上传和删除文件 我的问题是我无法获取上传的文件信息

我使用 vich 上传器配置“inject_on_load”作为 true

vich_uploader:
    db_driver: orm # or mongodb or propel or phpcr
    mappings:
        small_image:
            uri_prefix:         /uploads/images/small
            upload_destination: %kernel.root_dir%/../web/uploads/images/small
            namer:              vich_uploader.namer_uniqid
            inject_on_load:     true
            delete_on_update:   true
            delete_on_remove:   true

现在,当我将对象转储到控制器中时,我得到了具有文件注入属性的对象

Movie #679 ▼
 -id: 7
 -featureImageFile: -featureImageFile: File #771 ▼
    path: "C:\wamp/../web/uploads/images/feature"
    filename: "56cd61b786c57.jpg"
    basename: "56cd61b786c57.jpg"
    pathname: "C:\wamp\www\/uploads/images/feature\56cd61b786c57.jpg"
    extension: "jpg"
    realPath: "C:\wamp\www\uploads\images\feature\56cd61b786c57.jpg"
    aTime: 2016-02-24 08:54:30
    mTime: 2016-02-24 08:54:30
    cTime: 2016-02-24 08:54:30
    inode: 0
    size: 173519
    perms: 0100666
    owner: 0
    group: 0
    type: "file"
    writable: true
    readable: true
    executable: false
    file: true
    dir: false
    link: false
    linkTarget: "C:\wamp\...\images\feature\56cd61b786c57.jpg"
   
 -featureImageName: "56cd61b786c57.jpg"
  #regions: PersistentCollection #717 ▶
  #genre: Genre #739 ▶
  #language: Language #745 ▶
 

但我在奏鸣曲 postUpdate(movie) 保存挂钩中加载文件我没有得到有关文件的信息

public function postUpdate($movie)
    dump($movie); exit;

我得到了这个结果

Movie #679 ▼
 -id: 7
 -featureImageFile: null
 -featureImageName: "56cd61b786c57.jpg"
  #regions: PersistentCollection #717 ▶
  #genre: Genre #739 ▶
  #language: Language #745 ▶
 

这是我的电影实体类

<?php

namespace Application\NS\AdminBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Vich\UploaderBundle\Mapping\Annotation as Vich;
use Symfony\Component\HttpFoundation\File\File;


/**
 * Movie
 *
 * @ORM\Table(name="movie")
 * @ORM\Entity(repositoryClass="Application\NS\AdminBundle\Repository\MovieRepository")
 * @Vich\Uploadable
 */
class Movie




    /**
     * @Vich\UploadableField(mapping="feature_image", fileNameProperty="featureImageName")
     * @var File
     */
    private $featureImageFile;

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

    /**
     * Set featureImageName
     * @param string $featureImageName
     * @return object
     */
    public function setFeatureImageName($featureImageName) 
        $this->featureImageName = $featureImageName;
        return $this;
    

    /**
     * Get featureImageName
     * @return string
     */
    public function getFeatureImageName()
        return $this->featureImageName;
    


这是我的管理类

/**
 * @param FormMapper $formMapper
 */
protected function configureFormFields(FormMapper $formMapper)

    $formMapper
     ->add('featureImageFile', 'vich_image', array( 'required' => false, 'allow_delete'  => true, 'download_link' => false))
                

我缺少什么可以帮助任何人吗? 有没有其他方法可以将上传的文件信息注入实体对象

【问题讨论】:

你能显示你的实体和管理类代码吗? @jjgarcía 我已经用实体和管理类代码更新了我的问题 显示为空的转储样本是更新项目还是创建新项目?也许是一个愚蠢的问题 :-) 当我在不选择文件的情况下进行升级时,我可以重现这个转储。 @jjgarcía 谢谢,但我发现我们需要在学说对象上应用刷新 【参考方案1】:

我们需要手动刷新学说对象以加载更新的属性(通过事件将文件信息注入对象属性)

 $this->getContainer()->get('doctrine.orm.entity_manager')->refresh($movie);

【讨论】:

以上是关于Sonata Admin + Vich Upload 加载时注入不起作用的主要内容,如果未能解决你的问题,请参考以下文章

当sonata_type_admin调用时如何在Sonata的Admin类中获取底层对象?

Sonata 管理包:无法删除与 sonata_type_admin 的关系

服务“admin.category”依赖于不存在的服务“sonata.admin.manager.orm”

有没有办法确定 Sonata\AdminBundle\Admin\Admin::configureFormFields() 中的当前操作(创建或编辑)?

Sonata Admin Bundle - 自定义模板

Sonata Admin Bundle - 表单类型:sonata_type_collection - 自定义模板?