是否可以在OneupUploaderBundle中使用doctrine2持久保存不同的文件实体?

时间:2014-10-23 05:08:01

标签: symfony file-upload doctrine-orm oneupuploaderbundle

我有很多ORM实体,我想将它们链接到相应的文件。示例:带有MotorsFile的实体汽车,带有HousesFile的房屋,......

可以轻松定义这些ORM实体。这不是问题。但是,我的问题是:"是否可以在使用OneupUploaderBundle时定义许多ORM实体,例如我们的MotorsFile和HousesFile?"

我问过这个问题,因为处理这些带有教义的上传文件需要为PostUploadEventPostPersistEvent创建一个事件监听器。事件监听器就是这样的:

<?php

namespace Acme\HelloBundle\EventListener;

use Oneup\UploaderBundle\Event\PostPersistEvent;
use Minn\AdsBundle\Entity\MotorsAdsFile;

class UploadListener
{
    protected $manager;

    public function __construct(EntityManager $manager)
    {
        $this->manager = $manager;
    }

    public function onUpload(PostPersistEvent $event)
    {
        $file = $event->getFile();

        $object = new MotorsFile();
        $object->setFilename($file->getPathName());

        $this->manager->persist($object);
        $this->manager->flush();
    }
}

但是,这段代码只允许我持久化一个实体(例如MotorsFile)。那么,是否可以指定上传的文件对应哪个实体?

...谢谢

1 个答案:

答案 0 :(得分:2)

你基本上有两个选择。

鉴于您为不同的文件上传使用不同的映射,您可以使用将为每个映射分派的generic events

每次上传后,不仅会执行oneup_uploader.post_upload的侦听器,还会执行特殊事件oneup_uploader.post_upload.{mapping}的侦听器,其中{mapping}是{{1}中配置的名称}}

我们假设您的配置与此类似:

config.yml

将文件上传到oneup_uploader: mappings: motors: frontend: blueimp storage: directory: %kernel.root_dir%/../web/uploads/motors houses: frontend: blueimp storage: directory: %kernel.root_dir%/../web/uploads/houses 映射后,将调度通用事件motorsoneup_uploader.post_upload.motors映射也是如此。

如果您不想使用不同的上传处理程序,您还可以检查houses

type

<?php namespace Acme\HelloBundle\EventListener; use Oneup\UploaderBundle\Event\PostPersistEvent; use Minn\AdsBundle\Entity\MotorsAdsFile; class UploadListener { public function onUpload(PostPersistEvent $event) { $type = $this->getType(); } } 将为$typemotors,具体取决于文件上传到服务器的映射配置。