graphaware/neo4j-php-ogm 事件侦听器
graphaware/neo4j-php-ogm event listeners
我最近创建了一个依赖 graphaware/neo4j-php-ogm 和 neo4j/neo4j-bundle 的新 symfony 项目 (3.1) 来管理我的数据库。
然后我创建了一个名为 User 的新实体 class,它具有属性(登录名、密码...),我想在刷新事件发生之前自动设置当前日期(在 preFlush 上)。
我在 neo4j-php-ogm/src/Events.php (https://github.com/graphaware/neo4j-php-ogm/blob/master/src/Events.php) 中看到了 PRE_FLUSH 常量,但我没有在文档中找到有关它的任何信息。
嗯,我的问题是:我们可以在 OGM 的实际版本中使用此功能吗?如果是,您有使用示例吗?
感谢您的帮助!
是的,你可以,没有记录你是对的,我会确保很快。
首先,您需要创建一个 class,它将作为 EntityManager 的 preFlush
事件的 EventListener 和一个对该事件作出反应的方法:
<?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);
}
}
}
}
然后你可以在创建实体管理器后注册这个事件监听器:
/**
* @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());
}
测试结果:
ikwattro@graphaware-team ~/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)
数据库中的结果:
非常感谢!它工作完美。如果有人想使用它,请不要忘记将 属性 键入 "int"。 ;)
我最近创建了一个依赖 graphaware/neo4j-php-ogm 和 neo4j/neo4j-bundle 的新 symfony 项目 (3.1) 来管理我的数据库。
然后我创建了一个名为 User 的新实体 class,它具有属性(登录名、密码...),我想在刷新事件发生之前自动设置当前日期(在 preFlush 上)。 我在 neo4j-php-ogm/src/Events.php (https://github.com/graphaware/neo4j-php-ogm/blob/master/src/Events.php) 中看到了 PRE_FLUSH 常量,但我没有在文档中找到有关它的任何信息。
嗯,我的问题是:我们可以在 OGM 的实际版本中使用此功能吗?如果是,您有使用示例吗?
感谢您的帮助!
是的,你可以,没有记录你是对的,我会确保很快。
首先,您需要创建一个 class,它将作为 EntityManager 的 preFlush
事件的 EventListener 和一个对该事件作出反应的方法:
<?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);
}
}
}
}
然后你可以在创建实体管理器后注册这个事件监听器:
/**
* @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());
}
测试结果:
ikwattro@graphaware-team ~/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)
数据库中的结果:
非常感谢!它工作完美。如果有人想使用它,请不要忘记将 属性 键入 "int"。 ;)