2015-09-27 68 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(); 
      } 
     } 
    }