我想在我的学说模型中添加一个安全层。为了能够在SQL级别的doctrine过滤器中添加权限检查,我必须维护一些数据库表,其中包含为每个实体计算的访问控制令牌的缓存。
现在我必须更新这些表,在某些情况下,我必须完全重建其中一个缓存表。这必须在侦听onFlush事件的事件侦听器中完成。将这个存档的最佳(最高性能和最可靠)方法是什么?
记录了如何持久化新实体以及如何更改已持久化实体的关联和原始属性。这是通过调用工作对象单元的computeChangeSet()或recomputeSingleEntityChangeSet()并将每个单个实体传递给其中一个方法来完成的。在这些更新期间必须锁定整个系统,尽管它们很少见,但应尽快完成。另外,我不知道如何删除实体甚至截断整个表而不必先读出所有实体。
答案 0 :(得分:4)
首先,onFlush
非常强大,因此您可能过度思考。
要删除onFlush
中的实体,只需在听众中安排删除实体:
public function onFlush(OnFlushEventArgs $eventArgs) {
$em = $eventArgs->getEntityManager();
$uow = $em->getUnitOfWork();
foreach ($uow->getScheduledEntityUpdates() as $updated) {
$em->remove($updated);
}
$uow->computeChangeSet();
}
要处理批量更新,您可以:
请记住,在不更新应用程序级别对象的情况下更改数据库状态(批量更新/删除)是一种风险,因此请考虑在执行此类操作后清除实体管理器。
有关于transactions, concurrency and locking in the ORM的完整文档章节。据我所知,所有这些操作在onFlush
期间也有效。