2017-07-26 2 views
0

Ich habe diese Teilnehmer sich in AppBundle\DoctrineListeners Körper es ist dieseSymfony3.3, Doktrin2. EventSubscriber, auf Update nicht ausgeführt

namespace AppBundle\DoctrineListeners; 

use Doctrine\Common\EventSubscriber; 
use Doctrine\ORM\Event\OnFlushEventArgs; 
use AppBundle\Entity\Bing\KeyWordReport; 
use Doctrine\ORM\Events; 

/** 
* Listener used to on update fielt create history 
*/ 
class KeywordSubscriber implements EventSubscriber 
{ 
    public function onFlush(OnFlushEventArgs $args) 
    { 
     throw new \Exception("Error Processing Request", 1); //for testing 

     $em = $args->getEntityManager(); 
     $uow = $em->getUnitOfWork(); 

     foreach ($uow->getScheduledEntityUpdates() as $updated) { 
      if ($updated instanceof KeyWordReport) { 
       //do some work 
      } 
     } 

     $uow->computeChangeSets(); 
    } 

    public function getSubscribedEvents() 
    { 
     return [Events::onFlush => ['onFlush', 10], Events::preUpdate]; 
    } 
} 

i autoconfigure in symfony eingeführt bin mit 3,3

service.yml

services: 
    # default configuration for services in *this* file 
    _defaults: 
     # automatically injects dependencies in your services 
     autowire: true 
     # automatically registers your services as commands, event subscribers, etc. 
     autoconfigure: true 
     # this means you cannot fetch services directly from the container via $container->get() 
     # if you need to do this, you can override this setting on individual services 
     public: false 

in Entität habe ich in Annotation diese * @ORM\EntityListeners({"AppBundle\DoctrineListeners\KeywordSubscriber"}) warum es nicht ausgeführt wird?

+0

Lehre 'EventSubscribes' (http://symfony.com/doc/current/doctrine/event_listeners_subscribers.html) und' EntityListeners' (https: // symfony. com/doc/current/bundles/DoctrineBundle/entity-listeners.html) sind verschiedene Dinge. Und hier gibt es nichts mit Autowiring zu tun (Ihr Abonnent hat keine Abhängigkeit). Wenn Sie jedoch in Version 3.3 sind, können Sie die automatische Autoloading- und Autokonfigurationsfunktion verwenden, um diese Klasse automatisch als Dienst mit dem entsprechenden Tag zu registrieren. –

Antwort

0

Als @ YannEugoné noted in comment - EventSubscribes und Doctrine EntityListeners sind verschiedene Dinge. Ereignis-Listenern in Symfony haben registered manually sein:

namespace AppBundle\DoctrineListeners; 

use Doctrine\ORM\Event\OnFlushEventArgs; 
use AppBundle\Entity\Bing\KeyWordReport; 

class KeywordListener 
{ 
    public function onFlush(OnFlushEventArgs $eventArgs) 
    { 
     $em = $eventArgs->getEntityManager(); 
     $uow = $em->getUnitOfWork(); 

     foreach ($uow->getScheduledEntityInsertions() as $entity) { 
      // … some action 
     } 

     foreach ($uow->getScheduledEntityUpdates() as $entity) { 
      // … some action 
     } 

     foreach ($uow->getScheduledEntityDeletions() as $entity) { 
      // … some action 
     } 

     foreach ($uow->getScheduledCollectionDeletions() as $col) { 
      // … some action 
     } 

     foreach ($uow->getScheduledCollectionUpdates() as $col) { 
      // … some action 
     } 
    } 
} 
#services.yml 
services: 
    # … 

    AppBundle\DoctrineListeners\KeywordListener: 
     tags: 
      - { name: doctrine.event_listener, event: onFlush } 
+0

Ich habe Ihren Service-Code iserted aber immer noch sehe ich nicht, dass 'OnFlush' Funktion heißt – Viszman

+0

@Viszman Oh, ich habe das übersehen. Sie haben Symfony-Ereignis-Abonnent, Doctrine-Ereignis-Abonnent und Doctrine-Ereignis-Listener gemischt. Ich habe den Code aktualisiert. – jkucharovic

+0

Wenn ich den Namen in service.yml ändere, bekomme ich Fehler, dass das Laden fehlgeschlagen ist, also wird die Klasse geladen. Ich bekomme Ereignisse wie PreUpdate und PostUpdate ausgeführt, aber ich möchte den Zugriff auf beide Eigenschaften, oder minimal zu alt, wie ich readed kann ich tun, ist dann Ereignis "onFlush" wird von meiner Klasse Funktion ausgelöst wird nicht – Viszman

Verwandte Themen