SonataAdmin onComplete

时间:2014-11-13 20:57:37

标签: symfony sonata-admin

可以处理postFlush事件或类似的事情吗?我需要访问新寄存器的一些数据以生成其他内容,但必须在刷新之后,因为我使用Gedmo Slug和我需要的数据之一就是slug。

1 个答案:

答案 0 :(得分:0)

是的,在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。

如果您仍然有错误,可以发布更多代码来显示您正在修改的内容吗?