How to disable soft delete (Soft-deleteable) filter for doctrine in symfony

前端 未结 4 1680
梦如初夏
梦如初夏 2021-02-19 15:55

Installing and using SoftDeleteable behavior extension for Doctrine 2 is quite easy. The problem usually is trying to disable it for some code part and enabling again. You may w

4条回答
  •  耶瑟儿~
    2021-02-19 16:09

    1. How to load soft-deleted entity

    As per the documentation, disable filter for entity manager:

    $em->getFilters()->disable('softdeleteable');
    $object = $em->find('AppBundle:Object', 1); // soft-deleted entity will be loaded
    

    To enable soft-delete again:

    $em->getFilters()->enable('softdeleteable');
    

    Note: $em->clear(); may be required before this line, if entity was already loaded with disabled soft-delete filter.

    2. How to remove entity from database entirely

    Even though it is not mentioned in documentation, the first solution does not work if you need to remove entity and bypass soft-delete filter. Filter needs to be removed from entity manager's event listeners:

    // initiate an array for the removed listeners
    $originalEventListeners = [];
    
    // cycle through all registered event listeners
    foreach ($em->getEventManager()->getListeners() as $eventName => $listeners) {
        foreach ($listeners as $listener) {
            if ($listener instanceof \Gedmo\SoftDeleteable\SoftDeleteableListener) {
    
                // store the event listener, that gets removed
                $originalEventListeners[$eventName] = $listener;
    
                // remove the SoftDeletableSubscriber event listener
                $em->getEventManager()->removeEventListener($eventName, $listener);
            }
        }
    }
    
    // remove the entity
    $em->remove($object);
    $em->flush($object); // or $em->flush();
    
    // re-add the removed listener back to the event-manager
    foreach ($originalEventListeners as $eventName => $listener) {
        $em->getEventManager()->addEventListener($eventName, $listener);
    }
    

    References:

    • https://github.com/Atlantic18/DoctrineExtensions/blob/master/doc/softdeleteable.md
    • Force delete doctrine entity when using SoftDeletable by KnpLabs
    • Disable Soft Deleteable filter for hard delete record doesn't work

提交回复
热议问题