Doctrine\ORM\UnitOfWork::doRemove PHP Method

doRemove() private method

This method is internally called during delete() cascades as it tracks the already visited entities to prevent infinite recursions.
private doRemove ( object $entity, array &$visited )
$entity object The entity to delete.
$visited array The map of the already visited entities.
    private function doRemove($entity, array &$visited)
    {
        $oid = spl_object_hash($entity);
        if (isset($visited[$oid])) {
            return; // Prevent infinite recursion
        }

        $visited[$oid] = $entity; // mark visited

        $class = $this->em->getClassMetadata(get_class($entity));
        $entityState = $this->getEntityState($entity);
        switch ($entityState) {
            case self::STATE_NEW:
            case self::STATE_REMOVED:
                // nothing to do
                break;
            case self::STATE_MANAGED:
                if (isset($class->lifecycleCallbacks[Events::preRemove])) {
                    $class->invokeLifecycleCallbacks(Events::preRemove, $entity);
                }
                if ($this->evm->hasListeners(Events::preRemove)) {
                    $this->evm->dispatchEvent(Events::preRemove, new LifecycleEventArgs($entity, $this->em));
                }
                $this->scheduleForDelete($entity);
                break;
            case self::STATE_DETACHED:
                throw new InvalidArgumentException("A detached entity can not be removed.");
            default:
                throw new UnexpectedValueException("Unexpected entity state: $entityState.");
        }

        $this->cascadeRemove($entity, $visited);
    }