2015-09-27 69 views
2

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

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

我在我的项目中有一个MongoDB监听器,但是我的代码与您的代码非常不同。有一个更简单的方法,所有你必须这样做进口DocumentManager然后你可以从构造调用它在你所有的听众上使用它。我要告诉你我的代码,并告诉我,如果这帮助你;)

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(); 
      } 
     } 
    }