]> git.immae.eu Git - github/wallabag/wallabag.git/blobdiff - src/Wallabag/CoreBundle/Event/Subscriber/SQLiteCascadeDeleteSubscriber.php
Move related event things in Event folder
[github/wallabag/wallabag.git] / src / Wallabag / CoreBundle / Event / Subscriber / SQLiteCascadeDeleteSubscriber.php
diff --git a/src/Wallabag/CoreBundle/Event/Subscriber/SQLiteCascadeDeleteSubscriber.php b/src/Wallabag/CoreBundle/Event/Subscriber/SQLiteCascadeDeleteSubscriber.php
new file mode 100644 (file)
index 0000000..3b4c4cf
--- /dev/null
@@ -0,0 +1,70 @@
+<?php
+
+namespace Wallabag\CoreBundle\Event\Subscriber;
+
+use Doctrine\Common\EventSubscriber;
+use Doctrine\ORM\Event\LifecycleEventArgs;
+use Wallabag\CoreBundle\Entity\Entry;
+use Doctrine\Bundle\DoctrineBundle\Registry;
+
+/**
+ * SQLite doesn't care about cascading remove, so we need to manually remove associated stuf for an Entry.
+ * Foreign Key Support can be enabled by running `PRAGMA foreign_keys = ON;` at runtime (AT RUNTIME !).
+ * But it needs a compilation flag that not all SQLite instance has ...
+ *
+ * @see https://www.sqlite.org/foreignkeys.html#fk_enable
+ */
+class SQLiteCascadeDeleteSubscriber implements EventSubscriber
+{
+    private $doctrine;
+
+    /**
+     * @param \Doctrine\Bundle\DoctrineBundle\Registry $doctrine
+     */
+    public function __construct(Registry $doctrine)
+    {
+        $this->doctrine = $doctrine;
+    }
+
+    /**
+     * @return array
+     */
+    public function getSubscribedEvents()
+    {
+        return [
+            'preRemove',
+        ];
+    }
+
+    /**
+     * We removed everything related to the upcoming removed entry because SQLite can't handle it on it own.
+     * We do it in the preRemove, because we can't retrieve tags in the postRemove (because the entry id is gone).
+     *
+     * @param LifecycleEventArgs $args
+     */
+    public function preRemove(LifecycleEventArgs $args)
+    {
+        $entity = $args->getEntity();
+
+        if (!$this->doctrine->getConnection()->getDriver() instanceof \Doctrine\DBAL\Driver\PDOSqlite\Driver ||
+            !$entity instanceof Entry) {
+            return;
+        }
+
+        $em = $this->doctrine->getManager();
+
+        if (null !== $entity->getTags()) {
+            foreach ($entity->getTags() as $tag) {
+                $entity->removeTag($tag);
+            }
+        }
+
+        if (null !== $entity->getAnnotations()) {
+            foreach ($entity->getAnnotations() as $annotation) {
+                $em->remove($annotation);
+            }
+        }
+
+        $em->flush();
+    }
+}