可以处理 postFlush 事件或类似的事件吗?我需要访问新寄存器的一些数据来生成其他东西,但必须在刷新之后,因为我使用 Gedmo Slug,而我需要的数据之一是 slug。
是的,在 services.yml/xml 文件中创建一个侦听器,然后创建侦听器本身来更改您需要的代码。
#src/Acme/Bundle/YourBundle/Resources/config/services.yml
services:
contact_onflush.listener:
class: Acme\Bundle\YourBundle\Listener\YourListener
arguments: [@request_stack]
tags:
- { name: doctrine.event_listener, event: onFlush }
contact_postflush.eventlistener:
class: Acme\Bundle\YourBundle\Listener\YourListener
tags:
- { name: doctrine.event_listener, event: postFlush}
在监听器类中:
<?php
namespace Acme\YourBundle\YourListener;
use Doctrine\Common\EventArgs;
use Doctrine\Common\EventSubscriber;
use Doctrine\ORM\Event\OnFlushEventArgs;
use Doctrine\ORM\Event\PostFlushEventArgs;
use Symfony\Component\HttpFoundation\RequestStack;
class YourListener implements EventSubscriber
{
private $requestStack;
private $needsFlush;
public function __construct(Request $requestStack)
{
$this->requestStack= $requestStack;
$this->needsFlush= false;
}
public function onFlush(OnFlushEventArgs $args)
{
$em = $args->getEntityManager();
$uow = $em->getUnitOfWork();
// we would like to listen on insertions and updates events
$entities = array_merge(
$uow->getScheduledEntityInsertions(),
$uow->getScheduledEntityUpdates()
);
foreach ($entities as $entity) {
// every time we update or insert a new [Slug entity] we do the work
if ($entity instanceof Slug) {
//modify your code here
$x = new SomeEntity();
$em->persist($x);
//other modifications
$this-needsFlush = true;
$uow->computeChangeSets();
}
}
}
public function postFlush(PostFlushEventArgs $eventArgs) {
if ($this->needsFlush) {
$this->needsFlush = false;
$eventArgs->getEntityManager()->flush();
}
}
您也许可以使用computeChangeSet(单数),但我在使用它时遇到了问题。 您可以使用 preUpdate 来查找已更改的字段,而不是使用 onFlush,但是此事件在尝试持久化时有限制,您需要将其与 needFlush 之类的东西配对才能触发 postFlush。
如果仍然有错误,您可以发布更多代码来显示您正在修改的内容吗?