Passed
Pull Request — master (#102)
by Damien
02:53
created

CreateSchemaListener::getSubscribedEvents()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 2
nc 1
nop 0
dl 0
loc 4
rs 10
c 0
b 0
f 0
1
<?php
2
3
namespace DH\DoctrineAuditBundle\Event;
4
5
use DH\DoctrineAuditBundle\Helper\UpdateHelper;
6
use DH\DoctrineAuditBundle\Manager\AuditManager;
7
use DH\DoctrineAuditBundle\Reader\AuditReader;
8
use Doctrine\Common\EventSubscriber;
9
use Doctrine\ORM\Mapping\ClassMetadataInfo;
10
use Doctrine\ORM\Tools\Event\GenerateSchemaTableEventArgs;
11
use Doctrine\ORM\Tools\ToolEvents;
12
13
class CreateSchemaListener implements EventSubscriber
14
{
15
    /**
16
     * @var AuditManager
17
     */
18
    protected $manager;
19
20
    /**
21
     * @var AuditReader
22
     */
23
    protected $reader;
24
25
    public function __construct(AuditManager $manager, AuditReader $reader)
26
    {
27
        $this->manager = $manager;
28
        $this->reader = $reader;
29
    }
30
31
    public function postGenerateSchemaTable(GenerateSchemaTableEventArgs $eventArgs): void
32
    {
33
        $metadata = $eventArgs->getClassMetadata();
34
35
        // check inheritance type and returns if unsupported
36
        if (!\in_array($metadata->inheritanceType, [
37
            ClassMetadataInfo::INHERITANCE_TYPE_NONE,
38
            ClassMetadataInfo::INHERITANCE_TYPE_JOINED,
39
            ClassMetadataInfo::INHERITANCE_TYPE_SINGLE_TABLE,
40
        ], true)) {
41
            throw new \Exception(sprintf('Inheritance type "%s" is not yet supported', $metadata->inheritanceType));
42
        }
43
44
        // check reader and manager entity managers and returns if different
45
        if ($this->reader->getEntityManager() !== $this->manager->getConfiguration()->getEntityManager()) {
46
            return;
47
        }
48
49
        // check if entity or its children are audited
50
        if (!$this->manager->getConfiguration()->isAuditable($metadata->name)) {
51
            $audited = false;
52
            if (
53
                $metadata->rootEntityName === $metadata->name &&
54
                \in_array($metadata->inheritanceType, [
55
                    ClassMetadataInfo::INHERITANCE_TYPE_JOINED,
56
                    ClassMetadataInfo::INHERITANCE_TYPE_SINGLE_TABLE,
57
                ], true)
58
            ) {
59
                foreach ($metadata->subClasses as $subClass) {
60
                    if ($this->manager->getConfiguration()->isAuditable($subClass)) {
61
                        $audited = true;
62
                    }
63
                }
64
            }
65
            if (!$audited) {
66
                return;
67
            }
68
        }
69
70
        $updater = new UpdateHelper($this->manager, $this->reader);
71
        $updater->createAuditTable($eventArgs->getClassTable(), $eventArgs->getSchema());
72
    }
73
74
    /**
75
     * {@inheritdoc}
76
     */
77
    public function getSubscribedEvents()
78
    {
79
        return [
80
            ToolEvents::postGenerateSchemaTable,
81
        ];
82
    }
83
}
84