postUpdate 이벤트에서 Doctrine의 ChangeSet 가져오기
나는 onFlush 또는 preUpdate 동안 변경 사항을 저장하는 것이 트릭을 수행할 것이라고 생각했지만 어떻게 할까요? 추가 데이터베이스 호출을 시행하고 싶지 않았습니다. 따라서 symfony 캐시의 인메모리 ArrayAdapter가 도움이 됩니다.
설명서에 따르면:
Generally, this adapter is useful for testing purposes, as its contents are stored in memory and not persisted outside the running PHP process in any way.
실행중인 프로세스 후에 사라 졌습니까? 정확히 내가 필요한 것. 사전 업데이트 중에 설정하는 방법은 다음과 같습니다.
class DoctrineSubscriber implements EventSubscriberInterface
{
private ArrayAdapter $arrayAdapter;
public function __construct(
) {
$this->arrayAdapter = new ArrayAdapter();
}
public function getSubscribedEvents(): array
{
return [
Events::preUpdate, //OR
Events::onFlush,
// THEN
Events::postUpdate,
];
}
public function preUpdate(PreUpdateEventArgs $args): void
{
$entity = $args->getObject();
if ($entity instanceof Meeting) {
$this->arrayAdapter->get($entity->getId(), fn () => $args->getEntityChangeSet());
}
}
}
그런 다음 저장된 ID를 키로 사용하여 다음과 같이 쉽게 검색할 수 있습니다.
public function postUpdate(LifeCycleEventArgs $args)
{
$entity = $args->getObject();
if ($entity instanceof Meeting) {
$id = $entity->getId();
$changeSet = $this->arrayAdapter->getItem($id)->get();
}
}
어떤 이유로 데이터베이스가 오류로 인해 업데이트되지 않은 경우 postUpdate가 호출되지 않고 변경 세트가 사라집니다. 내가 필요로 하는 대로.
리스너 또는 구독자가 지속되기 전에 엔터티를 변경하는지 확인하려면 다음과 같이 대신 onFlush 이벤트를 사용해야 합니다/사용할 수 있습니다.
public function onFlush(OnFlushEventArgs $eventArgs): void
{
$uow = $eventArgs->getObjectManager()->getUnitOfWork();
foreach ($uow->getScheduledEntityUpdates() as $entity) {
if ($entity instanceof Meeting) {
$this->arrayAdapter->get($entity->getId(), fn () => $uow->getEntityChangeSet($entity));
}
}
}
onFlush는 데이터베이스 지속성 이전에 호출된 마지막 이벤트이기 때문에 나중에 변경 세트를 변경한 것이 거의 없다고 확신합니다.
면책 조항으로 ... 나는 uuid를 id로 사용하므로 캐시 키가 해당 변경에 대해 고유할 것이라고 확신합니다.
Reference
이 문제에 관하여(postUpdate 이벤트에서 Doctrine의 ChangeSet 가져오기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/parijke/getting-doctrines-changeset-in-a-postupdate-event-59ba텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)