2

我最近创建了一个新的 symfony 项目(3.1),它依赖于 graphaware/neo4j-php-ogm 和 neo4j/neo4j-bundle 来管理我的数据库。

然后我创建了一个名为 User 的新实体类,具有属性(登录名、密码……),我想在刷新事件发生之前自动设置当前日期(在 preFlush 上)。我在 neo4j-php-ogm/src/Events.php ( https://github.com/graphaware/neo4j-php-ogm/blob/master/src/Events.php )中看到了 PRE_FLUSH 常量,但我还没有找到文档中有关它的任何信息。

好吧,我的问题是:我们可以在 OGM 的实际版本中使用此功能吗?如果是,您有使用示例吗?

谢谢您的帮助 !

4

2 回答 2

2

是的,你可以,没有记录你是对的,我会确保它很快。

这里的集成测试:https ://github.com/graphaware/neo4j-php-ogm/blob/master/tests/Integration/EventListenerIntegrationTest.php

首先,您需要创建一个类,它将充当preFlushEntityManager 事件的 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)

数据库中的结果:

在此处输入图像描述

于 2017-02-10T21:50:56.423 回答
0

十分感谢 !这是完美的工作。如果有人想使用它,请不要忘记将您的属性输入为“int”。;)

于 2017-02-19T18:55:44.810 回答