Symfony 是否可以在实体存储库类而不是实体中编写生命周期回调?

Symfony 是否可以在实体存储库类而不是实体中编写生命周期回调?,symfony,callback,lifecycle,Symfony,Callback,Lifecycle,我很想知道我们是否可以在实体存储库类而不是实体本身中编写生命周期回调 我知道我可以在抽象类中编写回调,因为我的抽象基类必须被注释为映射的超类,并包含HasLifecycleCallbacks注释,答案是否定的,但是如果你想在单独的类中编写生命周期回调,你可以使用实体监听器,如Doctrine2.4中所示: 注册您的听众: <doctrine-mapping> <entity name="MyProject\Entity\User"> <ent

我很想知道我们是否可以在实体存储库类而不是实体本身中编写生命周期回调


我知道我可以在抽象类中编写回调,因为我的抽象基类必须被注释为映射的超类,并包含HasLifecycleCallbacks注释,答案是否定的,但是如果你想在单独的类中编写生命周期回调,你可以使用实体监听器,如Doctrine2.4中所示:

注册您的听众:

<doctrine-mapping>
    <entity name="MyProject\Entity\User">
        <entity-listeners>
            <entity-listener class="UserListener"/>
        </entity-listeners>
        <!-- .... -->
    </entity>
</doctrine-mapping>
也可以使用其他方法,如:

class UserListener
{
    public function preUpdate(User $user, PreUpdateEventArgs $event)
    {
        // Do something on pre update.
    }
}
<doctrine-mapping>
    <entity name="MyProject\Entity\User">
         <entity-listeners>
            <entity-listener class="UserListener">
                <lifecycle-callback type="preFlush"      method="preFlushHandler"/>
                <lifecycle-callback type="postLoad"      method="postLoadHandler"/>

                <lifecycle-callback type="postPersist"   method="postPersistHandler"/>
                <lifecycle-callback type="prePersist"    method="prePersistHandler"/>

                <lifecycle-callback type="postUpdate"    method="postUpdateHandler"/>
                <lifecycle-callback type="preUpdate"     method="preUpdateHandler"/>

                <lifecycle-callback type="postRemove"    method="postRemoveHandler"/>
                <lifecycle-callback type="preRemove"     method="preRemoveHandler"/>
            </entity-listener>
        </entity-listeners>
        <!-- .... -->
    </entity>
</doctrine-mapping>
唯一的缺点是:

为所有实体触发生命周期事件。它是 监听器和订阅者检查实体 属于它想要处理的类型


您可能需要创建一个自定义存储库。请看这篇文章:

否,但您可以将存储库注册为条令事件侦听器,并可能实现您的目标。
use Doctrine\ORM\Events;
use Doctrine\Common\EventSubscriber;
use Doctrine\Common\Persistence\Event\LifecycleEventArgs;

class MyEventSubscriber implements EventSubscriber
{
    public function getSubscribedEvents()
    {
        return array(
            Events::postUpdate,
        );
    }

    public function postUpdate(LifecycleEventArgs $args)
    {
        $entity = $args->getObject();
        $entityManager = $args->getObjectManager();

        // perhaps you only want to act on some "Product" entity
        if ($entity instanceof Product) {
            // do something with the Product
        }
    }