2012-11-26 4 views
7

Ich DoctrineExtensions mit StofDoctrineExtensionsBundle mit dem Soft-löschbar Verhalten zu bekommen.Softdeletable Verhalten und Löschen wirklich die Einheit

Es funktioniert wirklich gut im Frontend meiner Anwendung.

Im Backend i die Option müssen Entitäten „hart“ löschen.

$filters = $this->getModelManager()->getEntityManager($this->getClass())->getFilters(); 

if (array_key_exists('softdeleteable', $filters->getEnabledFilters())) { 
    $filters->disable('softdeleteable'); 
} 

Dies funktioniert (soft gelöscht Einheiten erscheinen in den Listen), aber wenn ich es versuchen, zu löschen, das Unternehmen hat:

Ich habe die Filter in meinem Admin-Controller (i verwenden SonataAdmin) deaktiviert werde wieder gelöscht. Wie kann ich ein "hartes" Löschen erzwingen?

Antwort

10

Sie müssen den Filter nicht deaktivieren - er wird nur zum Filtern von Datensätzen bei Auswahl verwendet. Sie müssen Hörer deaktivieren statt:

// $em is your EntityManager 
foreach ($em->getEventManager()->getListeners() as $eventName => $listeners) { 
    foreach ($listeners as $listener) { 
     if ($listener instanceof \Gedmo\SoftDeleteable\SoftDeleteableListener) { 
      $em->getEventManager()->removeEventListener($eventName, $listener); 
     } 
    } 
} 

und rufen dann

$em->remove($entity); 
$em->flush(); 
+0

Wie kann neu Sie es danach? – Jessica

+0

@Jessica, können Sie 'verwenden addEventListener' http://api.symfony.com/2.4/Symfony/Bridge/Doctrine/ContainerAwareEventManager.html#method_addEventListener – Dmitriy

+0

Vielen Dank, was ich tat, war speichern die Namen der Ereignisse, die ich habe entferne es, dann wiederhole es und füge es wieder hinzu. – Jessica

0

Obwohl diese Frage vielleicht etwas alt ist, ist es sinnvoll, jemand:

Ihrem eigenen Ereignis-Listener erstellen könnte eine bessere sein Lösung:

class SoftDeleteableListener extends BaseSoftDeleteableListener 
{ 

/** 
* @inheritdoc 
*/ 
public function onFlush(EventArgs $args) 
{ 
    $ea = $this->getEventAdapter($args); 
    $om = $ea->getObjectManager(); 
    //return from event listener if you disabled filter: $em->getFilters()->disable('softdeleteable'); 
    if (!$om->getFilters()->isEnabled('softdeleteable')) { 
     return; 
    } 

    parent::onFlush($args); 
} 

} 

und das Hinzufügen in Ihrer config:

gedmo.listener.softdeleteable: 
    class: AppBundle\EventListener\SoftDeleteableListener 
    tags: 
     - { name: doctrine.event_subscriber, connection: default } 
    calls: 
     - [ setAnnotationReader, [ @annotation_reader ] ] 

Quelle: https://github.com/Atlantic18/DoctrineExtensions/issues/1175

2

Nicht die anmutige Art und Weise: Sie immer eine echte löschen mit SQL tun kann, wird es softdeletable

$em->createQuery("DELETE MyEntity e WHERE e = :et")->setParameter('et',$entity)->execute(); 
4

Keine Notwendigkeit umgehen einen Hörer oder irgendetwas zu HARD erstellen Löschen mit aktiviertem Softdeleteable.

die ursprüngliche softdeleteable Ereignis hat diese Zeile:

$reflProp = $meta->getReflectionProperty($config['fieldName']); 
$oldValue = $reflProp->getValue($object); 
if ($oldValue instanceof \Datetime) { 
    continue; // want to hard delete 
} 

All dies bedeutet, wenn Sie:

$entity->setDeletedAt(new \Datetime()); 
$em->flush(); 

Und dann:

$em->remove($entity); 
$em->flush(); 

An diesem Punkt wird es schwer gelöscht werden .

Falls Sie bereits ein gültiges Datum innerhalb deletedAt Feld haben, wenn Sie anrufen -> flush() nach a -> entfernen ($ Entity) wird Ihre Einheit schwer gelöscht werden

+1

Dies sollte als Antwort akzeptiert werden. – Veve

Verwandte Themen