0

Symfony 2.3 を Sonata Admin Bundle with DoctrineExtensions ( 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が、でタグ付けすると にTagListener依存します。したがって、循環依存関係が作成されます。しかし、これはサービスコンテナによって検出されません。代わりに、doctrine 接続サービスが返されたにイベントを追加しようとします。詳細はこちらをご覧ください。doctrine.orm.default_entity_managerdoctrine.event_subscriber

これを修正するには2つの方法があります

  1. サービス コンテナを に挿入してから、オンデマンドでTagListenerロードできます。fpn_tag.tag_manager
  2. イベントのリスナーを作成しkernel.request、イベント サブスクライバーを手動でエンティティ マネージャーに追加します。

saveTagging余談ですが、内部preUpdateprePersistイベントに電話しないことをお勧めします。暗黙的なフラッシュを行うためsaveTagging、これらのイベントで呼び出すのは安全ではありません。

于 2013-08-05T22:59:34.097 に答える