获取实体的当前实例并将其传递给 Symfony 中的侦听器
Getting current instance of entity and passing it to a listener in Symfony
我有一个表单,用于将值放入两个不同的实体中。一个实体是 listing
table,另一个是 images
table。图像 table 由侦听 dropzone PostPersistEvent
的侦听器处理。每次将图像拖放到该区域时,它都会添加到数据库中。有一段时间我遇到一个问题,如果用户只是第一次创建表单,则列表不存在,因此没有 id
将我解决的 image
实体绑定到.
现在我正在尝试,每次拖放图像时,获取用户正在查看其表单的当前 listing
实体的 ID,并将其用作 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 }
我的目的是在图片上传到数据库时将列表 ID 添加到图片中。 image
实体中的 listing_id
绑定到列表实体的 id
,但我没有办法从侦听器中获取表单的当前实例
我的问题是,如何获取用户当前正在 UploadListener
中查看的实体 listing
的实例,以便我可以使用它的 id
并将其设置为上传图片的listing_id
。
在上传时包含列表 ID。
如果拖放区是一个单独的表单,添加一个带有id的隐藏输入。您可以在您的模板中呈现值,并在加载时使用 JS 填充它。
如果dropzone是通过JS初始化的,在params选项中添加ID。
现在 UploadListener
在请求中有列表 ID。
至于在创建列表时包含图像,您可以在呈现创建表单之前生成 ID,例如一个 UUIDv4,将其设置为实体,现在它也呈现在表单中,可用于上传。
在你的树枝中,你应该有一个 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 中获取列表 ID 请求对象,如下所示:
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();
}
}
我有一个表单,用于将值放入两个不同的实体中。一个实体是 listing
table,另一个是 images
table。图像 table 由侦听 dropzone PostPersistEvent
的侦听器处理。每次将图像拖放到该区域时,它都会添加到数据库中。有一段时间我遇到一个问题,如果用户只是第一次创建表单,则列表不存在,因此没有 id
将我解决的 image
实体绑定到.
现在我正在尝试,每次拖放图像时,获取用户正在查看其表单的当前 listing
实体的 ID,并将其用作 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 }
我的目的是在图片上传到数据库时将列表 ID 添加到图片中。 image
实体中的 listing_id
绑定到列表实体的 id
,但我没有办法从侦听器中获取表单的当前实例
我的问题是,如何获取用户当前正在 UploadListener
中查看的实体 listing
的实例,以便我可以使用它的 id
并将其设置为上传图片的listing_id
。
在上传时包含列表 ID。
如果拖放区是一个单独的表单,添加一个带有id的隐藏输入。您可以在您的模板中呈现值,并在加载时使用 JS 填充它。
如果dropzone是通过JS初始化的,在params选项中添加ID。
现在 UploadListener
在请求中有列表 ID。
至于在创建列表时包含图像,您可以在呈现创建表单之前生成 ID,例如一个 UUIDv4,将其设置为实体,现在它也呈现在表单中,可用于上传。
在你的树枝中,你应该有一个 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 中获取列表 ID 请求对象,如下所示:
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();
}
}