]> git.immae.eu Git - github/wallabag/wallabag.git/blob - src/Wallabag/CoreBundle/Event/Subscriber/SQLiteCascadeDeleteSubscriber.php
Merge pull request #3596 from glego/add-secure-email
[github/wallabag/wallabag.git] / src / Wallabag / CoreBundle / Event / Subscriber / SQLiteCascadeDeleteSubscriber.php
1 <?php
2
3 namespace Wallabag\CoreBundle\Event\Subscriber;
4
5 use Doctrine\Bundle\DoctrineBundle\Registry;
6 use Doctrine\Common\EventSubscriber;
7 use Doctrine\ORM\Event\LifecycleEventArgs;
8 use Wallabag\CoreBundle\Entity\Entry;
9
10 /**
11 * SQLite doesn't care about cascading remove, so we need to manually remove associated stuf for an Entry.
12 * Foreign Key Support can be enabled by running `PRAGMA foreign_keys = ON;` at runtime (AT RUNTIME !).
13 * But it needs a compilation flag that not all SQLite instance has ...
14 *
15 * @see https://www.sqlite.org/foreignkeys.html#fk_enable
16 */
17 class SQLiteCascadeDeleteSubscriber implements EventSubscriber
18 {
19 private $doctrine;
20
21 /**
22 * @param \Doctrine\Bundle\DoctrineBundle\Registry $doctrine
23 */
24 public function __construct(Registry $doctrine)
25 {
26 $this->doctrine = $doctrine;
27 }
28
29 /**
30 * @return array
31 */
32 public function getSubscribedEvents()
33 {
34 return [
35 'preRemove',
36 ];
37 }
38
39 /**
40 * We removed everything related to the upcoming removed entry because SQLite can't handle it on it own.
41 * We do it in the preRemove, because we can't retrieve tags in the postRemove (because the entry id is gone).
42 *
43 * @param LifecycleEventArgs $args
44 */
45 public function preRemove(LifecycleEventArgs $args)
46 {
47 $entity = $args->getEntity();
48 if (!$this->doctrine->getConnection()->getDatabasePlatform() instanceof \Doctrine\DBAL\Platforms\SqlitePlatform
49 || !$entity instanceof Entry) {
50 return;
51 }
52
53 $em = $this->doctrine->getManager();
54
55 if (null !== $entity->getTags()) {
56 foreach ($entity->getTags() as $tag) {
57 $entity->removeTag($tag);
58 }
59 }
60
61 if (null !== $entity->getAnnotations()) {
62 foreach ($entity->getAnnotations() as $annotation) {
63 $em->remove($annotation);
64 }
65 }
66
67 $em->flush();
68 }
69 }