我已多次阅读文档,但我遗漏了一些东西......我似乎无法做到这一点。
场景:我有一个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"})但找到了类,但从未执行过它....
如何定义事件?我该如何发送?监听器和订阅者之间有什么区别?
非常感谢一个简单的例子。
谢谢。
答案 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
}
}
}