CreateSchemaListener   A
last analyzed

Complexity

Total Complexity 11

Size/Duplication

Total Lines 65
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 28
dl 0
loc 65
rs 10
c 0
b 0
f 0
wmc 11

3 Methods

Rating   Name   Duplication   Size   Complexity  
B postGenerateSchemaTable() 0 38 9
A __construct() 0 4 1
A getSubscribedEvents() 0 4 1
1
<?php
2
3
namespace DH\DoctrineAuditBundle\Event;
4
5
use DH\DoctrineAuditBundle\Reader\Reader;
6
use DH\DoctrineAuditBundle\Transaction\TransactionManager;
7
use DH\DoctrineAuditBundle\Updater\UpdateManager;
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
use Exception;
13
14
class CreateSchemaListener implements EventSubscriber
15
{
16
    /**
17
     * @var TransactionManager
18
     */
19
    protected $transactionManager;
20
21
    /**
22
     * @var Reader
23
     */
24
    protected $reader;
25
26
    public function __construct(TransactionManager $transactionManager, Reader $reader)
27
    {
28
        $this->transactionManager = $transactionManager;
29
        $this->reader = $reader;
30
    }
31
32
    public function postGenerateSchemaTable(GenerateSchemaTableEventArgs $eventArgs): void
33
    {
34
        $metadata = $eventArgs->getClassMetadata();
35
36
        // check inheritance type and returns if unsupported
37
        if (!\in_array($metadata->inheritanceType, [
38
            ClassMetadataInfo::INHERITANCE_TYPE_NONE,
39
            ClassMetadataInfo::INHERITANCE_TYPE_JOINED,
40
            ClassMetadataInfo::INHERITANCE_TYPE_SINGLE_TABLE,
41
        ], true)) {
42
            throw new Exception(sprintf('Inheritance type "%s" is not yet supported', $metadata->inheritanceType));
43
        }
44
45
        // check reader and manager entity managers and returns if different
46
        if ($this->reader->getEntityManager() !== $this->transactionManager->getConfiguration()->getEntityManager()) {
47
            return;
48
        }
49
50
        // check if entity or its children are audited
51
        if (!$this->transactionManager->getConfiguration()->isAuditable($metadata->name)) {
52
            $audited = false;
53
            if (
54
                $metadata->rootEntityName === $metadata->name &&
55
                ClassMetadataInfo::INHERITANCE_TYPE_SINGLE_TABLE === $metadata->inheritanceType
56
            ) {
57
                foreach ($metadata->subClasses as $subClass) {
58
                    if ($this->transactionManager->getConfiguration()->isAuditable($subClass)) {
59
                        $audited = true;
60
                    }
61
                }
62
            }
63
            if (!$audited) {
64
                return;
65
            }
66
        }
67
68
        $updater = new UpdateManager($this->transactionManager, $this->reader);
69
        $updater->createAuditTable($eventArgs->getClassTable(), $eventArgs->getSchema());
70
    }
71
72
    /**
73
     * {@inheritdoc}
74
     */
75
    public function getSubscribedEvents()
76
    {
77
        return [
78
            ToolEvents::postGenerateSchemaTable,
79
        ];
80
    }
81
}
82