0

我正在使用 Symfony 2.3 和带有DoctrineExtensions的 Sonata Admin Bundle (由StofDoctrineExtensionsBundle启用)。我启用、配置并成功测试了 SoftDeleteable 和 Timestampable 组件。

现在,当我尝试使用 Symfony 标记服务添加另一个 Doctrine 事件订阅者时,似乎 softdeleteable 侦听器被禁用。

我的服务:

my.contact.listener.tag:
    class: My\ContactBundle\EventListener\TagListener
    tags:
        - { name: doctrine.event_subscriber, connection: default }
    calls:
        - [ setTagManager, [ @fpn_tag.tag_manager ] ]

订户:

namespace My\ContactBundle\EventListener;


use Doctrine\Common\EventSubscriber;
use Doctrine\ORM\Event\LifecycleEventArgs;
use DoctrineExtensions\Taggable\Taggable;
use FPN\TagBundle\Entity\TagManager;

class TagListener implements EventSubscriber
{
    /**
     * @var TagManager
     */
    private $tagManager;

    /**
     * @param \FPN\TagBundle\Entity\TagManager $tagManager
     */
    public function setTagManager($tagManager)
    {
        $this->tagManager = $tagManager;
    }

    /**
     * Load tags for Taggable entities
     *
     * @param LifecycleEventArgs $args
     */
    public function postLoad(LifecycleEventArgs $args)
    {
        $entity = $args->getEntity();

        if ($entity instanceof Taggable) {
            $this->tagManager->loadTagging($entity);
        }
    }

    /**
     * Save tags for Taggable entities
     *
     * @param LifecycleEventArgs $args
     */
    public function preUpdate(LifecycleEventArgs $args)
    {
        $entity = $args->getEntity();

        if ($entity instanceof Taggable) {
            $this->tagManager->saveTagging($entity);
        }
    }

    /**
     * Save tags for Taggable entities
     *
     * @param LifecycleEventArgs $args
     */
    public function prePersist(LifecycleEventArgs $args)
    {
        $entity = $args->getEntity();

        if ($entity instanceof Taggable) {
            $this->tagManager->saveTagging($entity);
        }
    }

    public function getSubscribedEvents()
    {
        return array(
            'prePersist',
            'preUpdate',
            'postLoad',
        );
    }
}

在每个请求中,我都会遇到异常:

Listener "SoftDeleteableListener" was not added to the EventManager!

如果我禁用我的订阅者,问题就消失了。如何启用我的事件订阅者并拥有 softdeleteable?

4

1 回答 1

2

我遇到了和你今天一样的问题。

问题在于这fpn_tag.tag_manager取决于,doctrine.orm.default_entity_manager但如果你用. 从而产生循环依赖。但这并没有被服务容器检测到,而是在学说连接服务返回后尝试添加事件。在此处查看更多详细信息。TagListenerdoctrine.orm.default_entity_managerdoctrine.event_subscriber

有两种方法可以解决此问题

  1. 您可以将服务容器注入,然后按需TagListener加载。fpn_tag.tag_manager
  2. 创建kernel.request事件监听器,然后手动将事件订阅者添加到实体管理器。

附带说明,我建议不要调用saveTagging内部preUpdateprePersist事件。因为saveTagging会进行隐式刷新,在这些事件中调用它是不安全的。

于 2013-08-05T22:59:34.097 回答