SonataAdmin 已完成

问题描述 投票:0回答:1

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

php symfony sonata-admin
1个回答
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。

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

© www.soinside.com 2019 - 2024. All rights reserved.