2017-02-09 2 views
2

J'ai récemment créé un nouveau projet symfony (3.1) avec une dépendance sur graphaware/neo4j-php-ogm et neo4j/neo4j-bundle pour gérer ma base de données.graphaware/neo4j-php-ogm écouteurs d'événements

Ensuite, j'ai créé une nouvelle classe Entity nommée User avec les propriétés (login, mot de passe, ...) et je veux définir automatiquement la date actuelle avant que l'événement flush se produise (sur preFlush). J'ai vu la constante PRE_FLUSH dans neo4j-php-ogm/src/Events.php (https://github.com/graphaware/neo4j-php-ogm/blob/master/src/Events.php) mais je n'ai trouvé aucune information à ce sujet dans la documentation. Eh bien, ma question est la suivante: Pouvons-nous utiliser cette fonctionnalité dans la version actuelle de l'OGM? Si oui, avez-vous un exemple de l'utilisation?

Merci pour votre aide!

Répondre

2

Oui, vous pouvez, il n'est pas documenté que vous avez raison, je vais m'assurer que ce sera bientôt.

Test d'intégration ici: https://github.com/graphaware/neo4j-php-ogm/blob/master/tests/Integration/EventListenerIntegrationTest.php

Tout d'abord, vous devez créer une classe qui servira EventListener à l'événement preFlush du EntityManager et une méthode réagir à l'événement:

<?php 

namespace GraphAware\Neo4j\OGM\Tests\Integration\Listeners; 

use GraphAware\Neo4j\OGM\Event\PreFlushEventArgs; 
use GraphAware\Neo4j\OGM\Tests\Integration\Model\User; 

class Timestamp 
{ 
    public function preFlush(PreFlushEventArgs $eventArgs) 
    { 
     $dt = new \DateTime("NOW", new \DateTimeZone("UTC")); 

     foreach ($eventArgs->getEntityManager()->getUnitOfWork()->getNodesScheduledForCreate() as $entity) { 
      if ($entity instanceof User) { 
       $entity->setUpdatedAt($dt); 
      } 
     } 
    } 
} 

Ensuite, vous pouvez enregistrer cet écouteur d'événement, après avoir la création du gestionnaire d'entités:

/** 
    * @group pre-flush 
    */ 
    public function testPreFlushEvent() 
    { 
     $this->clearDb(); 
     $this->em->getEventManager()->addEventListener(Events::PRE_FLUSH, new Timestamp()); 

     $user = new User("ikwattro"); 

     $this->em->persist($user); 
     $this->em->flush(); 

     $this->assertNotNull($user->getUpdatedAt()); 
     var_dump($user->getUpdatedAt()); 
    } 

Résultat du test:

[email protected] ~/d/g/p/ogm> ./vendor/bin/phpunit tests/ --group pre-flush 
PHPUnit 5.6.2 by Sebastian Bergmann and contributors. 

Runtime:  PHP 5.6.27 
Configuration: /Users/ikwattro/dev/graphaware/php/ogm/phpunit.xml.dist 

.                 1/1 (100%)int(1486763241) 


Time: 378 ms, Memory: 5.00MB 

OK (1 test, 1 assertion) 

Résultat dans la base de données:

enter image description here

+0

Merci beaucoup pour votre aide. Je vais essayer demain! – Sobraz

+0

comment ça s'est passé, des nouvelles? –

0

Merci beaucoup! C'est un travail parfait. Si quelqu'un veut l'utiliser, n'oubliez pas de taper votre propriété comme "int". ;)