Symfony的例外注册新学说事件订阅时(SoftDeleteable)(Symfony excep

2019-10-30 07:34发布

我使用Symfony的2.3奏鸣曲管理员捆绑与DoctrineExtensions (由启用StofDoctrineExtensionsBundle )。 我启用,配置和测试成功SoftDeleteable和Timestampable组件。

现在,当我尝试使用Symfony的服务标记添加另一种学说事件订阅,它似乎在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呢?

Answer 1:

因为你今天我得到了同样的问题。

问题是, fpn_tag.tag_manager取决于doctrine.orm.default_entity_manager ,但TagListener是依赖doctrine.orm.default_entity_manager如果你用它标记doctrine.event_subscriber 。 从而产生循环依赖关系。 但是,这不是由服务容器检测,而不是它试图返回学说连接服务添加的事件。 查看更多细节在这里 。

有两种方法来解决这个问题

  1. 你可以注入的服务容器到TagListener ,然后加载fpn_tag.tag_manager需求。
  2. 创建上的监听kernel.request事件,则该事件的用户手动添加到实体管理器。

一个侧面说明,我建议对呼叫saveTaggingpreUpdateprePersist事件。 由于saveTagging做一个隐含的红晕,这是不是安全的在这些事件中调用。



文章来源: Symfony exception when registering new Doctrine event subscriber (SoftDeleteable)