/** * Deletes an entity as part of the current unit of work. * * This method is internally called during delete() cascades as it tracks * the already visited entities to prevent infinite recursions. * * @param object $entity The entity to delete. * @param array $visited The map of the already visited entities. * @throws InvalidArgumentException If the instance is a detached entity. */ 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 ORMException::detachedEntityCannotBeRemoved(); default: throw ORMException::invalidEntityState($entityState); } $this->_cascadeRemove($entity, $visited); }