Symfony 2 Doctrine MongoDB实体监听器

时间:2015-09-27 13:18:57

标签: php mongodb symfony events doctrine-orm

我试图让实体监听器在Symfony 2.7中使用ODM,但无济于事。

 a51.document.listener.store:
    class: A51\FilesystemBundle\EventListener\StoreEntityListener
    tags:
        -  { name: doctrine.odm.mongodb.document_manager, event: postLoad, method: onPostLoad }
    arguments: [@a51.repo.file]

<?php

namespace A51\FilesystemBundle\EventListener;

use Doctrine\Common\EventSubscriber;
use Doctrine\ORM\Event\LifecycleEventArgs;
use A51\FilesystemBundle\Document\Store;
use A51\FilesystemBundle\Repository\FileRepositoryInterface;

class StoreEntityListener
{
    /**
     * @var FileRepositoryInterface
     */
    private $fileRepository;

    public function __construct(FileRepositoryInterface $fileRepository)
    {
        $this->fileRepository = $fileRepository;
    }

    public function onPostLoad(LifecycleEventArgs $args)
    {
        $this->index($args);
    }

    public function index(LifecycleEventArgs $args)
    {
        $entity = $args->getEntity();
        $entityManager = $args->getEntityManager();

        if ($entity instanceof Store) 
        {
            $entity->setTotalByteSize($this->fileRepository->findSumFilesSizeByStore($entity));
        }
    }
}

我已经尝试过几乎所有我在文档中找到的内容但由于某种原因onPostLoad方法无法调用。

使用ParamConverter加载商店文档:

     * @ParamConverter("store", class="A51FilesystemBundle:Store")

欢迎任何帮助。

1 个答案:

答案 0 :(得分:1)

我的项目中有一个MongoDB监听器,但是我的代码与你的代码差别很大。有一种更简单的方法,你必须要做的就是导入 DocumentManager ,然后你可以从 construct 调用它来在你所有的监听器上使用它。我要告诉你我的代码并告诉我这是否对你有帮助;)

namespace AppBundle\OdmListener;

use Doctrine\ORM\Event\PostPersistEventArgs;
use Doctrine\ORM\Event\PreUpdateEventArgs;
use Doctrine\ORM\Event\LifecycleEventArgs;
use Doctrine\ODM\MongoDB\DocumentManager;

class RedundancyListener
{
    /**
     * @var DocumentManager
     */
    private $dm;

    /**
     * @param DocumentManager $odm
     */
    function __construct(DocumentManager $dm)
    {

        $this->dm = $dm;

    }

然后在内部,您可以在控制器中执行任何查询或更新。如果您导入它们,也可以使用ORM或ODM CycleEvents ,就像我在示例中所做的那样。

    /**
         * @param LifecycleEventArgs $eventArgs
         */
        public function preUpdate(LifecycleEventArgs $eventArgs)
        {
            $entity = $eventArgs->getEntity();

            if ($entity instanceof \AppBundle\Entity\Example) {

                    $subscriptionHash = $this->getSubscription($entity);

                    $this->dm->createQueryBuilder('AppBundle\Document\Example')
                        ->update()
                        //->multiple(true)
                        ->field('name')->set($entity->getName())
                        ->field('last_name')->set($entity->getLastName())
                        ->field('mail')->set($entity->getMail())
                        ->getQuery()
                        ->execute();
             }
      }
  }