2

我有许多 ORM 实体,我想将它们链接到它们相应的文件。示例:带有 MotorsFile 的实体 Motors,带有 HousesFile 的 Houses,...

这些 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)。那么,是否可以指定上传的文件对应于哪个实体呢?

谢谢...

4

1 回答 1

2

你基本上有两个选择。

鉴于您对不同的文件上传使用不同的映射,您可以使用将为每个映射调度的通用事件。

每次上传后,不仅oneup_uploader.post_upload会执行监听器,还会执行特殊事件的监听器oneup_uploader.post_upload.{mapping}{mapping}您的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

将文件上传到motors映射后,oneup_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();
    }
}

$type将是motorshouses,具体取决于文件上传到服务器的映射配置。

于 2014-10-23T05:59:22.913 回答