postUpdate 이벤트에서 Doctrine의 ChangeSet 가져오기

2470 단어 symfonydoctrine
최근에는 데이터베이스가 업데이트된 후 수명 주기 이벤트에서 엔터티의 변경 사항이 필요했습니다. 일반적으로 postUpdate 이벤트는 이 정보에 액세스할 수 없습니다. 그래서 뭘 할건데?

나는 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로 사용하므로 캐시 키가 해당 변경에 대해 고유할 것이라고 확신합니다.

좋은 웹페이지 즐겨찾기