]>
Commit | Line | Data |
---|---|---|
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 | } |