слушатели событий 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? Если да, есть ли у вас пример использования?

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


person Sobraz    schedule 09.02.2017    source источник


Ответы (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)

Результат в базе:

введите здесь описание изображения

person Christophe Willemsen    schedule 10.02.2017
comment
Большое спасибо за вашу помощь. Завтра попробую! - person Sobraz; 12.02.2017
comment
как прошло, есть новости? - person Christophe Willemsen; 13.02.2017

Спасибо большое ! Это работает отлично. Если кто-то хочет использовать его, не забудьте указать свое свойство как «int». ;)

person Sobraz    schedule 19.02.2017