Слушатели событий graphaware/neo4j-php-ogm

Недавно я создал новый проект Symfony (3.1) с зависимостью от graphaware/neo4j-php-ogm и neo4j/neo4j-bundle для управления моей базой данных.

Затем я создал новый класс Entity с именем User со свойствами (логин, пароль, ...) и хочу автоматически установить текущую дату до наступления события сброса (на preFlush). Я видел константу PRE_FLUSH в neo4j-php-ogm / src / Events.php ( https://github.com/graphaware/neo4j-php-ogm/blob/master/src/Events.php), но не нашел любая информация об этом в документации.

Итак, мой вопрос: можем ли мы использовать эту функциональность в реальной версии OGM? Если да, у вас есть пример использования?

Спасибо за помощь!

2 ответа

Решение

Да, вы можете, это не задокументировано, вы правы, я позабочусь, чтобы это было в ближайшее время.

Интеграционный тест здесь: https://github.com/graphaware/neo4j-php-ogm/blob/master/tests/Integration/EventListenerIntegrationTest.php

Во-первых, вам нужно создать класс, который будет действовать как EventListener для preFlush событие EntityManager и метод, реагирующий на событие:

<?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".;)

Другие вопросы по тегам