如何在持久保存实体时创建事件监听器

时间:2017-10-15 17:23:30

标签: symfony doctrine-orm

我是Symfony上的事件监听器的新手,我希望找到一种在持久保存特定实体(即用户)时触发事件的好方法。

我搜索了文档,虽然我发现对onKernel事件的引用,但我无法为我需要的东西创建一个监听器。你能指点我正确的方向还是举个例子?

3 个答案:

答案 0 :(得分:3)

这是有充分记录的here

您基本上创建了一个实现Doctrine\Common\EventSubscriber的类,然后您有一个方法getSubscribedEvents(),您可以在其中添加要触发它的事件,它看起来像:

public function getSubscribedEvents()
{
    return ['postPersist'];
}

public function postPersist(LifecycleEventArgs $args)
{
    $object = $args->getEntity();

    if (!$object instanceof User) {
        return;
    }

    $this->doSomething($object);
}

答案 1 :(得分:1)

您应该从EventSubscriber类实现,并且可以使用以下事件:

prePersistpreUpdatepostPersistpostUpdate

示例:

ApplicationBundle / EventSubscriber / EntitySubscriber.php

namespace App\ApplicationBundle\EventSubscriber;

use Doctrine\Common\EventSubscriber;
use Doctrine\ORM\Event\LifecycleEventArgs;
use Doctrine\ORM\Event\PreUpdateEventArgs;

/**
 * Class EntitySubscriber
 */
class EntitySubscriber implements EventSubscriber
{

    /**
     * Get subscribed events
     *
     * @return array
     */
    public function getSubscribedEvents()
    {
        return [
            'preUpdate',
        ];
    }

    /**
     * @param LifecycleEventArgs $args
     */
    public function preUpdate(LifecycleEventArgs $args)
    {
        /** @var PreUpdateEventArgs $args */
        $entity  = $args->getEntity();
        $changes = $args->getEntityChangeSet();
        dump($changes);
    }
}

答案 2 :(得分:0)

为了完整性:

如果您只需要处理 1 个实体类(例如 prePersist)上的 1 个生命周期事件(例如 User),您可以使用 https://symfony.com/doc/4.4/doctrine/events.html 中记录的 4 个选项中的任何一个,但是可能更合适的是生命周期回调实体监听器

生命周期回调示例:

在您的实体中:

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\HasLifecycleCallbacks  <-- DO NOT FORGET TO ADD THIS
 */
class User
{
    /* properties, getters/setters... */

    /**
     * @ORM\PrePersist
     */
    public function onPrePersist(): void
    {
        /* write your logic here */
    }
}

(请注意,您不能注入服务)。

实体监听器示例:

(1) 新类:

namespace App\EventListener;

use App\Entity\User;
use Doctrine\Persistence\Event\LifecycleEventArgs;

class UserPrePersistListener
{
    public function __construct(/* you can inject services here */)
    {
        /* ... */
    }

    public function __invoke(User $user, LifecycleEventArgs $event): void
    {
        /* write your logic here */
    }
}

(2) 配置:

services:
    # ...

    App\EventListener\UserPrePersistListener:
        tags: [{ name: doctrine.orm.entity_listener, entity: App\Entity\User, event: prePersist }]

如果您需要处理 2 个以上实体类的 1 个生命周期事件,请使用生命周期侦听器

如果您需要处理 1 个实体类上的 2 个以上生命周期事件,或 2 个以上实体类上的 2 个以上生命周期事件,请使用 生命周期订阅者