SQLiteCascadeDeleteSubscriber   A
last analyzed

Complexity

Total Complexity 9

Size/Duplication

Total Lines 46
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 17
dl 0
loc 46
rs 10
c 0
b 0
f 0
wmc 9

3 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 3 1
A getSubscribedEvents() 0 4 1
B preRemove() 0 23 7
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
    public function __construct(Registry $doctrine)
22
    {
23
        $this->doctrine = $doctrine;
24
    }
25
26
    /**
27
     * @return array
28
     */
29
    public function getSubscribedEvents()
30
    {
31
        return [
32
            'preRemove',
33
        ];
34
    }
35
36
    /**
37
     * We removed everything related to the upcoming removed entry because SQLite can't handle it on it own.
38
     * We do it in the preRemove, because we can't retrieve tags in the postRemove (because the entry id is gone).
39
     */
40
    public function preRemove(LifecycleEventArgs $args)
41
    {
42
        $entity = $args->getEntity();
43
        if (!$this->doctrine->getConnection()->getDatabasePlatform() instanceof \Doctrine\DBAL\Platforms\SqlitePlatform
44
            || !$entity instanceof Entry) {
45
            return;
46
        }
47
48
        $em = $this->doctrine->getManager();
49
50
        if (null !== $entity->getTags()) {
51
            foreach ($entity->getTags() as $tag) {
52
                $entity->removeTag($tag);
53
            }
54
        }
55
56
        if (null !== $entity->getAnnotations()) {
57
            foreach ($entity->getAnnotations() as $annotation) {
58
                $em->remove($annotation);
59
            }
60
        }
61
62
        $em->flush();
63
    }
64
}
65