2014-10-23 1 views
2

У меня есть много объектов ORM, которые я хочу связать с соответствующими файлами. Пример: сущность Двигатели с MotorsFile, Дома с HousesFile, ...Можно ли сохранить разные объекты файлов с помощью doctrine2 в OneupUploaderBundle?

Эти объекты ORM могут быть легко определены. Это не проблема. Но моя проблема заключается в следующем: «Можно ли определить многие объекты ORM, такие как MotorsFile и HousesFile, используя OneupUploaderBundle

Я задал этот вопрос, потому что для обработки этого загруженного файла с доктриной необходимо создать прослушиватель событий до PostUploadEvent и PostPersistEvent. Слушатель событие было бы что-то подобное:

<?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). Таким образом, можно ли указать загруженный файл, соответствующий тому сущности?

Спасибо ...

ответ

2

У вас в основном есть два варианта.

Учитывая, что вы используете разные сопоставления для разных файлов, вы можете использовать generic events, которые будут отправлены для каждого сопоставления.

После каждой загрузки не только слушатели для 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 будет либо motors или houses, в зависимости от которых отображение конфигурации файл был загружен на сервер.