فهرست منبع

SoftDeleteable: add enable/disable filter for specified entity

Patrik Votocek 12 سال پیش
والد
کامیت
d933886275

+ 5 - 0
doc/softdeleteable.md

@@ -205,6 +205,11 @@ $em->getFilters()->disable('soft-deleteable');
 $art = $repo->findOneBy(array('title' => 'My Article'));
 
 $this->assertTrue(is_object($art));
+
+// Enable / Disable filter filter, for specified entity (default is enabled for all)
+$filter = $em->getFilters()->enable('soft-deleteable');
+$filter->disableForEntity('Entity\Article');
+$filter->enableForEntity('Entity\Article');
 ```
 
 Easy like that, any suggestions on improvements are very welcome.

+ 18 - 0
lib/Gedmo/SoftDeleteable/Filter/SoftDeleteableFilter.php

@@ -12,6 +12,7 @@ use Doctrine\ORM\Mapping\ClassMetaData,
  *
  * @author Gustavo Falco <comfortablynumb84@gmail.com>
  * @author Gediminas Morkevicius <gediminas.morkevicius@gmail.com>
+ * @author Patrik Votoček <patrik@votocek.cz>
  * @package Gedmo.SoftDeleteable
  * @subpackage Filter
  * @link http://www.gediminasm.org
@@ -22,9 +23,14 @@ class SoftDeleteableFilter extends SQLFilter
 {
     protected $listener;
     protected $entityManager;
+    protected $disabled = array();
 
     public function addFilterConstraint(ClassMetadata $targetEntity, $targetTableAlias)
     {
+        if (array_key_exists($targetEntity->getName(), $this->disabled)) {
+            return '';
+        }
+
         $config = $this->getListener()->getConfiguration($this->getEntityManager(), $targetEntity->name);
 
         if (!isset($config['softDeleteable']) || !$config['softDeleteable']) {
@@ -36,6 +42,18 @@ class SoftDeleteableFilter extends SQLFilter
         return $targetTableAlias.'.'.$column.' IS NULL';
     }
 
+    public function disableForEntity($class)
+    {
+        $this->disabled[$class] = true;
+    }
+
+    public function enableForEntity($class)
+    {
+        if (array_key_exists($class, $this->disabled)) {
+            unset($this->disabled[$class]);
+        }
+    }
+
     protected function getListener()
     {
         if ($this->listener === null) {

+ 31 - 0
tests/Gedmo/SoftDeleteable/SoftDeleteableEntityTest.php

@@ -20,6 +20,7 @@ use Doctrine\Common\Util\Debug,
  *
  * @author Gustavo Falco <comfortablynumb84@gmail.com>
  * @author Gediminas Morkevicius <gediminas.morkevicius@gmail.com>
+ * @author Patrik Votoček <patrik@votocek.cz>
  * @package Gedmo.SoftDeleteable
  * @link http://www.gediminasm.org
  * @license MIT License (http://www.opensource.org/licenses/mit-license.php)
@@ -236,6 +237,36 @@ class SoftDeleteableEntityTest extends BaseTestCaseORM
 
     }
 
+    public function testSoftDeleteableFilter()
+    {
+        $filter = $this->em->getFilters()->enable(self::SOFT_DELETEABLE_FILTER_NAME);
+        $filter->disableForEntity(self::USER_CLASS);
+
+        $repo = $this->em->getRepository(self::USER_CLASS);
+
+        $newUser = new User();
+        $username = 'test_user';
+        $newUser->setUsername($username);
+
+        $this->em->persist($newUser);
+        $this->em->flush();
+
+        $user = $repo->findOneBy(array('username' => $username));
+
+        $this->assertNull($user->getDeletedAt());
+
+        $this->em->remove($user);
+        $this->em->flush();
+
+        $user = $repo->findOneBy(array('username' => $username));
+        $this->assertNotNull($user->getDeletedAt());
+
+        $filter->enableForEntity(self::USER_CLASS);
+
+        $user = $repo->findOneBy(array('username' => $username));
+        $this->assertNull($user);
+    }
+
     public function testPostSoftDeleteEventIsDispatched()
     {
         $subscriber = $this->getMock(