Doctrine2事件听众?订阅者?调度?

时间:2014-07-18 23:14:50

标签: doctrine-orm zend-framework2

我已多次阅读文档,但我遗漏了一些东西......我似乎无法做到这一点。

场景:我有一个Tshirts实体(id,qtyTotals)和一个Sizes实体(tshirt_id,size,qty),每次创建,更新或删除新的Size时,我需要通过以下方式更新Tshirts.qtyTotals:选择所有尺寸,添加它们并更新总计。

我确信我可以通过两个单独的步骤从我的控制器执行此操作,但我觉得事件方法是正确的。

我一直在阅读http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/events.html#entity-listeners特别是2.4节。

我试图使用注释:@ORM \ EntityListeners({" TshirtListener"})但找到了类,但从未执行过它....

如何定义事件?我该如何发送?监听器和订阅者之间有什么区别?

非常感谢一个简单的例子。

谢谢。

1 个答案:

答案 0 :(得分:2)

您可以使用Module.php函数中模块onBootstrap类中的Doctrine事件管理器将事件附加到实体,如下所示:

class Module 
{
    public function onBootstrap(MvcEvent $e)
    {
        $application           = $e->getApplication();
        $sm                    = $application->getServiceManager();
        $doctrineEntityManager = $sm->get('doctrine.entitymanager.orm_default');
        $doctrineEventManager  = $doctrineEntityManager->getEventManager();
        $doctrineEventManager->addEventListener(
            array(\Doctrine\ORM\Events::prePersist, \Doctrine\ORM\Events::preUpdate),
            new \Application\Listener\MyEntityListener($sm)
        );
    }
}

在监听器中,你可以做任何你想做的事情,例如:

namespace Application\Listener;

class EntityListener
{
    private $sm;

    public function __construct($sm)
    {
        $this->sm = $sm;
    }

    public function prePersist($eventArgs)
    {
        $entity = $eventArgs->getEntity();
        if (method_exists($entity, 'setTotals')) {
            //Update entity totals
        }
    }

    public function preUpdate($eventArgs)
    {
        $entity = $eventArgs->getEntity();
        if (method_exists($entity, 'setTotals')) {
            //Update entity totals
        }
    }
}