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
|
|
|
|