dflydev / dflydev-doctrine-orm-service-provider

Doctrine ORM Service Provider
MIT License
209 stars 59 forks source link

Registering an entity listener #75

Closed pstephenson02 closed 8 years ago

pstephenson02 commented 8 years ago

Hi, and thanks in advance for reading this and responding!

I would like to register an entity listener. Here is how I have tried to accomplish this:

$app->register(
    new \Dflydev\Provider\DoctrineOrm\DoctrineOrmServiceProvider(),
    [
        'orm.proxies_dir' => __DIR__.'/../var/cache/doctrine/orm/Proxies',
        'orm.em.options' => [
            'mappings' => [
                [
                    'type' => 'annotation',
                    'use_simple_annotation_reader' => false,
                    'namespace' => 'ImpactApi\Model',
                    'path' => __DIR__.'/../lib/ImpactApi/Model'
                ],
            ],
        ]
    ]
);
$app['orm.em']
    ->getConfiguration()
    ->getEntityListenerResolver()
    ->register(new \ImpactApi\EventListener\UserTicketListener());

My Listener looks like this:

class UserTicketListener
{
    /**
     * @param EventUserTicket $userTicket
     * @param PreFlushEventArgs $args
     * @return null
     * @ORM\PreFlush
     */
    public function preFlush(EventUserTicket $userTicket, PreFlushEventArgs $args)
    {
        $history = new UserTicketHistory(
            $userTicket->getUser(),
            $userTicket->getPrice(),
            $userTicket->getState()
        );

        $em = $args->getEntityManager();
        $em->persist($history);
        $em->flush($history);
        return null;
    }
}

And finally...

/**
 * @ORM\Entity
 * @ORM\EntityListeners({ "ImpactApi\EventListener\UserTicketListener" })
 */
class UserTicketHistory

I have also tried:

// index.php
$app['user_ticket.entity_listener'] = function () use ($app) {
    return new \ImpactApi\EventListener\UserTicketListener();
}
$app['orm.em']
    ->getConfiguration()
    ->getEntityListenerResolver()
    ->register($app['user_ticket.entity_listener']);

and finally...

// index.php
$app['orm.entity_listener_resolver']->register($app['user_ticket.entity_listener']);

What am I doing wrong here?

Do I need to instantiate the OrmServiceProvider, then register the listener, and then register that object on $app? e.g.

$ormServiceProvider = new \Dflydev\Provider\DoctrineOrm\DoctrineOrmServiceProvider();
$ormServiceProvider['orm.entity_listener_resolver']->register($app['user_ticket.entity_listener']);

$app->register($ormServiceProvider, [ /* other options */ ]);

In the UnitOfWork->commit function, it checks the event manager for preFlush listeners:

    public function commit($entity = null)
    {
        // Raise preFlush
        if ($this->evm->hasListeners(Events::preFlush)) {
            $this->evm->dispatchEvent(Events::preFlush, new PreFlushEventArgs($this->em));
        }

I threw a die statement in the conditional and it's just not being hit.

Any advice would be appreciated. Thanks!

pstephenson02 commented 8 years ago

Well this one is slightly embarrassing... I put the @EntityListeners tag on the wrong entity!