Получение текущего экземпляра объекта и передача его слушателю в Symfony
У меня есть форма, которая используется, чтобы поставить значения в двух разных сущностях. Одна сущность является listing
стол, а другой является images
Таблица. Таблица изображений обрабатывается слушателем, который прослушивает дропзону PostPersistEvent
, Каждый раз, когда изображение перетаскивается в зону, оно добавляется в базу данных. Некоторое время у меня была проблема, что, если пользователь только создавал форму в первый раз, список не существовал, и поэтому не было id
завязать image
юридическое лицо, которое я решил.
Теперь я пытаюсь, каждый раз, когда изображение перетаскивается, получить идентификатор текущего listing
объект, для которого пользователь просматривает форму и использует его в качестве значения для listing_id
в образе сущности.
Загрузить слушатель
<?php
namespace DirectoryPlatform\AppBundle\EventListener;
use Doctrine\Common\Persistence\ObjectManager;
use Oneup\UploaderBundle\Event\PostPersistEvent;
use DirectoryPlatform\AppBundle\Entity\MotorsAdsFile;
use Symfony\Bundle\FrameworkBundle\Routing\Router;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use FOS\UserBundle\Event\FilterUserResponseEvent;
use FOS\UserBundle\FOSUserEvents;
class UploadListener
{
protected $manager;
public function __construct(ObjectManager $manager)
{
$this->manager = $manager;
}
// If I could pass a current instance of the currently viewed Listing entity here, that would be ideal
public function onUpload(PostPersistEvent $event)
{
$file = $event->getFile();
// images entity
$object = new MotorsAdsFile();
$object->setImageName($file->getPathName());
// I'd want to set the listing_id of MotorsAdsFile to the id of the currently viewed listing here
// $object->setListing($listing->getId());
$this->manager->persist($object);
$this->manager->flush();
}
}
MotorsAdsFile (изображение объекта)
/**
* @param Listing $listing
*/
public function setListing($listing)
{
$this->listing = $listing;
}
services.yml
directory_platform.upload_listener:
class: DirectoryPlatform\AppBundle\EventListener\UploadListener
arguments: ["@doctrine.orm.entity_manager"]
tags:
- { name: kernel.event_listener, event: oneup_uploader.post_persist, method: onUpload }
Мое намерение состоит в том, чтобы добавить идентификатор листинга к изображению после его загрузки в базу данных. listing_id
в image
сущность привязана к id
объекта листинга, но у меня нет способа получить текущий экземпляр формы из слушателя
Мой вопрос, как мне получить экземпляр сущности listing
что пользователь в настоящее время просматривает в UploadListener
так что я могу использовать это id
и установите его на listing_id
загруженного изображения.
2 ответа
В вашей ветке вам необходим скрипт javascript для настройки dropzone для передачи некоторых дополнительных параметров вашему запросу:
<script>
Dropzone.options.yourFormId = {
params: {
listing: "{{ listing.id }}" // if you pass listing as a variable to your template
// or listing: "{{ form.vars.value.id }}" if listing is the underlying object of your form
}
};
</script>
Тогда в вашем UploadListener
класс получает идентификатор объекта запроса следующим образом:
class UploadListener
{
protected $manager;
public function __construct(ObjectManager $manager)
{
$this->manager = $manager;
}
// If I could pass a current instance of the currently viewed Listing entity here, that would be ideal
public function onUpload(PostPersistEvent $event)
{
$file = $event->getFile();
$object = new MotorsAdsFile();
$object->setImageName($file->getPathName());
// Get the listing parameter
$request = $event->getRequest();
$listingId = $request->get('listing');
// //
$object->setListing($listingId);
$this->manager->persist($object);
$this->manager->flush();
}
}
Включите Идентификатор списка в загрузку.
Если dropzone представляет собой отдельную форму, добавьте скрытый ввод с идентификатором. Вы можете отобразить значение в своем шаблоне, чтобы заполнить его при загрузке с помощью JS.
Если dropzone инициализируется через JS, добавьте ID к параметру params.
Сейчас UploadListener
имеет идентификационный номер в запросе.
Что касается включения изображений при создании листинга, вы можете сгенерировать ID перед рендерингом формы создания, например, UUIDv4, установить для нее сущность, и теперь она также отображается в форме, пригодной для загрузки.