我正在使用Doctrine来保存用户数据,我希望有一个最后的修改字段.
下面是用户按下Save后我想如何保存表单的伪代码:
>开始交易
>做很多事情,可能是查询数据库,可能不是
>如果此交易有任何改变
>修改上次更新的字段
>提交事务
有问题的部分是这个交易会改变什么. Doctrtrine可以给我这样的信息吗?
如何判断当前交易中的实体是否已更改?
编辑
只是为了清理,我试图在一个名为User的实体中修改一个名为lastUpdated的字段,如果在提交当前事务时任何实体(包括但不限于User)将被更改.换句话说,如果我启动事务并修改名为Garage的实体的名为nbCars的字段,我希望更新User实体的lastUpdated字段,即使该实体尚未被修改.
解决方法:
这是一个必要的回复,旨在纠正@ColinMorelli发布的内容(因为不允许在生命周期事件监听器中进行刷新 – 是的,在文档中有一个位置说不然,但我们将摆脱它,所以请不要做到这一点!).
您可以通过以下听众简单地收听onFlush
:
use Doctrine\Common\EventSubscriber;
use Doctrine\ORM\Event\OnFlushEventArgs;
use Doctrine\ORM\Events;
class UpdateUserEventSubscriber implements EventSubscriber
{
protected $user;
public function __construct(User $user)
{
// assuming the user is managed here
$this->user = $user;
}
public function onFlush(OnFlushEventArgs $args)
{
$em = $args->getEntityManager();
$uow = $em->getUnitOfWork();
// before you ask, `(bool) array()` with empty array is `false`
if (
$uow->getScheduledEntityInsertions()
|| $uow->getScheduledEntityUpdates()
|| $uow->getScheduledEntityDeletions()
|| $uow->getScheduledCollectionUpdates()
|| $uow->getScheduledCollectionDeletions()
) {
// update the user here
$this->user->setLastModifiedDate(new DateTime());
$uow->recomputeSingleEntityChangeSet(
$em->getClassMetadata(get_class($this->user)),
$this->user
);
}
}
public function getSubscribedEvents()
{
return array(Events::onFlush);
}
}
仅当UnitOfWork包含要提交给DB的更改时,这将更改应用于已配置的User对象(工作单元实际上是您可能定义为应用程序级别状态事务的工作单元).
您可以随时通过致电向ORM注册此订户
$user = $entityManager->find('User', 123);
$eventManager = $entityManager->getEventManager();
$subscriber = new UpdateUserEventSubscriber($user);
$eventManager->addEventSubscriber($subscriber);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。