2016-07-11 14 views
0

Ich habe ein System, wo ein Benutzer eine Bestellung erstellen kann. Sobald der Auftrag erstellt wurde, sollte eine weitere Entitätstabelle mit dem aktuellen Benutzer, der den Auftrag erstellt hat, dem Zeitpunkt, an dem er erstellt wurde, und einigen anderen Informationen aktualisiert werden.Symfony PHP Event Listener funktioniert nicht

Grundsätzlich ein Protokoll.

Hier ist meine Listener-Klasse;

namespace Qi\Bss\BaseBundle\Lib\PurchaseModule; 

use Qi\Bss\BaseBundle\Entity\Business\PurchaseModule\PmodLog; 
use Qi\Bss\BaseBundle\Entity\Business\PurchaseModule\PmodOrder; 

use Doctrine\ORM\Event\LifecycleEventArgs; 

/** 
* Class OrderLogger. Purchase Module activity logger. 
*/ 
class OrderLogger 
{ 
    /** 
    * Service container 
    * @var type 
    */ 
    private $serviceContainer; 

    /** 
    * Performs tasks before destruction 
    * @ORM\PostPersist 
    */ 
    public function postPersist(LifecycleEventArgs $args) 
    { 
     $order = $args->getEntity(); 

     if ($order instanceof PmodOrder) { 
      $logRecord = new PmodLog(); 

      $user = $this->serviceContainer->get('security.token_storage')->getToken()->getUser(); 

      $logRecord->setCreatedBy($user); 
      $logRecord->setAction('Gemaak'); 
      $logRecord->setCreatedAt(new \DateTime()); 
      $logRecord->setOrder($order); 
      $logRecord->setDepartment($user->getDepartment()); 
     } 
    } 

    /** 
    * Sets the sales order exporter object 
    * @param type $serviceContainer 
    */ 
    public function setServiceContainer($serviceContainer) 
    { 
     $this->serviceContainer = $serviceContainer; 
    } 
} 

Ich bekomme nicht, was ich falsch mache und dass die Protokolltabelle in meiner Datenbank überhaupt nicht aktualisiert wird.

Hier ist auch mein Service;

Ich bekomme keinen Fehler, die Bestellung wird perfekt erstellt, aber die Protokolldatenbank bleibt leer

Antwort

0

nicht gut Sie müssen und bündig$logRecord bestehen? Sie können den Entity Manager von $args abrufen.

+0

Ahh! Vielen Dank! Ich war mir dessen bewusst, dass persist und flush und probierten '$ em = $ this-> getDoctrine() -> getManager();' aber das funktioniert nur in Controllern, richtig? Ich wusste nicht, dass ich den Entity Manager von '$ args' bekommen kann. –

+0

Siehe http://www.doctrine-project.org/api/orm/2.1/class-Doctrine.ORM.Event.LifecycleEventArgs.html. – dlondero

0

Sie können dies an Ihre anpassen. Direkt nachdem jemand eine User Entität erstellt hat, wird eine neue UserLog Entität/ein Datensatz erstellt, indem auch einige Daten aus der User Entität eingefügt werden.

-Controller

public function createAction() 
{ 
    $user = new User(); 
    $user->setUsername('username'); 
    $user->setPassword('password'); 

    $this->entityManager->persist($user); 
    $this->entityManager->flush(); 
} 

Services.yml

services: 
    application_backend.event_listener.user_entity: 
     class: Application\BackendBundle\EventListener\UserEntityListener 
     tags: 
       - { name: doctrine.event_listener, event: postPersist } 

UserEntityListener.php

namespace Application\BackendBundle\EventListener; 

use Application\BackendBundle\Entity\User; 
use Application\BackendBundle\Entity\UserLog; 
use Doctrine\ORM\Event\LifecycleEventArgs; 

class UserEntityListener 
{ 
    public function postPersist(LifecycleEventArgs $args) 
    { 
     $entity = $args->getEntity(); 

     if ($entity instanceof User) { 
      $log = new UserLog(); 
      $log->setUserId($entity->getId()); 
      $log->setMessage('postPersist at ' . date('d/m/Y H:i:s')); 

      $em = $args->getEntityManager(); 
      $em->persist($log); 
      $em->flush(); 
     } 
    } 
} 
+0

Vielen Dank! Ich habe es von @ dlondero Antwort zu arbeiten, aber deins hätte den Trick auch getan. Habe meinen Upvote (wird angezeigt, wenn ich 15 Wiederholungen bekomme). –

+0

Ich denke, du solltest Dinge nicht innerhalb eines Event-Listeners löschen. Im Moment werden Sie zweimal gespült, zuerst im Listener, gebunden an postPersist, dann im Controller (aber dieser spült nichts). Ich würde die Flush() entfernen (aber behalte die Persistenz) im Listener, und lassen Sie den Controller die flush() behandeln. – VaN