浏览代码

Adding softdeleteable events.

Justin Hendrickson 12 年之前
父节点
当前提交
47c875af3e

+ 29 - 2
lib/Gedmo/SoftDeleteable/SoftDeleteableListener.php

@@ -6,7 +6,8 @@ use Doctrine\Common\Persistence\ObjectManager,
     Doctrine\Common\Persistence\Mapping\ClassMetadata,
     Gedmo\Mapping\MappedEventSubscriber,
     Gedmo\Loggable\Mapping\Event\LoggableAdapter,
-    Doctrine\Common\EventArgs;
+    Doctrine\Common\EventArgs,
+    Doctrine\ORM\Event\LifecycleEventArgs;
 
 /**
  * SoftDeleteable listener
@@ -20,6 +21,21 @@ use Doctrine\Common\Persistence\ObjectManager,
  */
 class SoftDeleteableListener extends MappedEventSubscriber
 {
+
+    /**
+     * Pre soft-delete event
+     *
+     * @var string
+     */
+    const PRE_SOFT_DELETE = "preSoftDelete";
+
+    /**
+     * Post soft-delete event
+     *
+     * @var string
+     */
+    const POST_SOFT_DELETE = "postSoftDelete";
+
     /**
      * {@inheritdoc}
      */
@@ -43,12 +59,18 @@ class SoftDeleteableListener extends MappedEventSubscriber
         $ea = $this->getEventAdapter($args);
         $om = $ea->getObjectManager();
         $uow = $om->getUnitOfWork();
+        $evm = $om->getEventManager();
         
         foreach ($uow->getScheduledEntityDeletions() as $entity) {
             $meta = $om->getClassMetadata(get_class($entity));
             $config = $this->getConfiguration($om, $meta->name);
 
             if (isset($config['softDeleteable']) && $config['softDeleteable']) {
+                $evm->dispatchEvent(self::PRE_SOFT_DELETE, new LifecycleEventArgs(
+                    $entity,
+                    $om
+                ));
+
                 $reflProp = $meta->getReflectionProperty($config['fieldName']);
                 $date = new \DateTime();
                 $oldValue = $reflProp->getValue($entity);
@@ -59,6 +81,11 @@ class SoftDeleteableListener extends MappedEventSubscriber
                 $uow->scheduleExtraUpdate($entity, array(
                     $config['fieldName'] => array($oldValue, $date)
                 ));
+
+                $evm->dispatchEvent(self::POST_SOFT_DELETE, new LifecycleEventArgs(
+                    $entity,
+                    $om
+                ));
             }
         }
     }
@@ -82,4 +109,4 @@ class SoftDeleteableListener extends MappedEventSubscriber
     {
         return __NAMESPACE__;
     }
-}
+}

+ 52 - 2
tests/Gedmo/SoftDeleteable/SoftDeleteableEntityTest.php

@@ -42,7 +42,7 @@ class SoftDeleteableEntityTest extends BaseTestCaseORM
     {
         parent::setUp();
 
-        $evm = new EventManager;
+        $evm = new EventManager();
         $this->softDeleteableListener = new SoftDeleteableListener();
         $evm->addEventSubscriber($this->softDeleteableListener);
         $config = $this->getMockAnnotatedConfig();
@@ -236,6 +236,56 @@ class SoftDeleteableEntityTest extends BaseTestCaseORM
 
     }
 
+    public function testPostSoftDeleteEventIsDispatched()
+    {
+        $subscriber = $this->getMock(
+            "Doctrine\Common\EventSubscriber",
+            array(
+                "getSubscribedEvents",
+                "preSoftDelete",
+                "postSoftDelete"
+            )
+        );
+
+        $subscriber->expects($this->once())
+                   ->method("getSubscribedEvents")
+                   ->will($this->returnValue(array(SoftDeleteableListener::PRE_SOFT_DELETE, SoftDeleteableListener::POST_SOFT_DELETE)));
+
+        $subscriber->expects($this->exactly(2))
+                   ->method("preSoftDelete")
+                   ->with($this->anything());
+
+        $subscriber->expects($this->exactly(2))
+                   ->method("postSoftDelete")
+                   ->with($this->anything());
+
+        $this->em->getEventManager()->addEventSubscriber($subscriber);
+
+        $repo = $this->em->getRepository(self::ARTICLE_CLASS);
+        $commentRepo = $this->em->getRepository(self::COMMENT_CLASS);
+
+        $comment = new Comment();
+        $commentField = 'comment';
+        $commentValue = 'Comment 1';
+        $comment->setComment($commentValue);
+        $art0 = new Article();
+        $field = 'title';
+        $value = 'Title 1';
+        $art0->setTitle($value);
+        $art0->addComment($comment);
+
+        $this->em->persist($art0);
+        $this->em->flush();
+        
+        $art = $repo->findOneBy(array($field => $value));
+
+        $this->assertNull($art->getDeletedAt());
+        $this->assertNull($comment->getDeletedAt());
+
+        $this->em->remove($art);
+        $this->em->flush();
+     }
+
     protected function getUsedEntityFixtures()
     {
         return array(
@@ -249,4 +299,4 @@ class SoftDeleteableEntityTest extends BaseTestCaseORM
             self::OTHER_COMMENT_CLASS
         );
     }
-}
+}