2017-03-10 2 views
2

inlclude habe ich eine Einheit BaseInformationLehre/Symfony: Wie EntityManager in EntityListener

/** 
* @ORM\Entity 
* @ORM\EntityListeners({"AppBundle\EntityListener\BaseInformationListener"}) 
* @ORM\Table(name="BaseInformation") 
*/ 
class BaseInformation 
{ ... 

Deshalb habe ich eine EntityListener

/** 
* Class BaseInformationListener 
* @package AppBundle\EventListener 
*/ 
class BaseInformationListener 
{ 
    /** 
    * @ORM\PreUpdate 
    * 
    * @param BaseInformation $baseInformation 
    * @param PreUpdateEventArgs $event 
    */ 
    public function preUpdateHandler(BaseInformation $baseInformation, PreUpdateEventArgs $event) 
    { 
     dump($baseInformation); 
     dump($event->getEntityChangeSet()); 
    } 
} 

Ich brauche die ChangeSet in die Datenbank zu speichern. Aber ich habe keinen Zugang zu einem EntityManager. Ich kann einen Dienst daraus machen, aber der Listener wird automatisch über die Annotation in der Entität aufgerufen. Also, wie habe ich Zugriff auf die EnttiyManager zum Speichern meiner ChangeSet zum Beispiel?

+0

welche Version der Doktrin verwenden Sie? – Matteo

+0

Mit Blick auf das Offensichtliche vielleicht? $ event-> getEventManager(); http://www.doctrine-project.org/api/orm/2.5/class-Doctrine.ORM.Event.PreUpdateEventArgs.html Seien Sie jedoch vorsichtig, wenn Sie versuchen, den Entity Manager innerhalb dieser Art von Ereignissen zu verwenden, wird dies selten gut enden. – Cerad

Antwort

1

Sie den Hörer einen Dienst definieren und sie als EntityListener markieren, so dass Sie die Abhängigkeit Sie benötigen in der Regel verwenden können:

services: 
    base_information_listener: 
     class: AppBundle\EntityListener\BaseInformationListener 
     arguments: ['@doctrine.orm.entity_manager'] 
     tags: 
      - { name: doctrine.orm.entity_listener } 

Vor der Lehre 2.5 Sie die Anmerkung in der zugehörigen Einheit verwenden, müssen auch (as described in the doc).

Hoffe diese Hilfe

+1

Versucht es, dann habe ich diese Ausnahme: ORMException in ORMException.php Zeile 38: Es ist eine Voraussetzung, einen Metadatentreiber anzugeben und an Doctrine \ ORM \ Configuration :: setMetadataDriverImpl() zu übergeben. Weil ich im Dienst eingestellt habe, um den EntityManager zu bekommen – Zwen2012

+1

hi @ Zwen2012 das Problem wird beschrieben [hier auf GitHub] (https://github.com/ doctrine/DoctrineBundle/issues/300) Sie können versuchen, den gesamten Container zu injizieren (aber es ist keine Best Practice) oder lösen, wie im letzten Kommentar beschrieben (mit einer Veröffentlichung von vor 14 Tagen) – Matteo

Verwandte Themen