DoctrineMappingListener   A
last analyzed

Complexity

Total Complexity 13

Size/Duplication

Total Lines 116
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 2

Importance

Changes 0
Metric Value
wmc 13
lcom 1
cbo 2
dl 0
loc 116
rs 10
c 0
b 0
f 0

7 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 5 1
A getSubscribedEvents() 0 4 1
A loadClassMetadata() 0 20 3
A processPageMetadata() 0 10 2
A processCategoryMetadata() 0 11 2
A processParent() 0 10 2
A processChildren() 0 10 2
1
<?php
2
3
/*
4
* This file is part of the OrbitaleCmsBundle package.
5
*
6
* (c) Alexandre Rock Ancelet <[email protected]>
7
*
8
* For the full copyright and license information, please view the LICENSE
9
* file that was distributed with this source code.
10
*/
11
12
namespace Orbitale\Bundle\CmsBundle\EventListener;
13
14
use Doctrine\Common\EventSubscriber;
15
use Doctrine\ORM\Event\LoadClassMetadataEventArgs;
16
use Doctrine\ORM\Events;
17
use Doctrine\ORM\Mapping\ClassMetadata;
18
19
/**
20
 * This class adds automatically the ManyToOne and OneToMany relations in Page and Category entities,
21
 * because it's normally impossible to do so in a mapped superclass.
22
 */
23
class DoctrineMappingListener implements EventSubscriber
24
{
25
    /**
26
     * @var string
27
     */
28
    private $pageClass;
29
30
    /**
31
     * @var string
32
     */
33
    private $categoryClass;
34
35
    public function __construct($pageClass, $categoryClass)
36
    {
37
        $this->pageClass     = $pageClass;
38
        $this->categoryClass = $categoryClass;
39
    }
40
41
    /**
42
     * Returns an array of events this subscriber wants to listen to.
43
     *
44
     * @return array
45
     */
46
    public function getSubscribedEvents()
47
    {
48
        return [Events::loadClassMetadata];
49
    }
50
51
    public function loadClassMetadata(LoadClassMetadataEventArgs $eventArgs)
52
    {
53
        /** @var ClassMetadata $classMetadata */
54
        $classMetadata = $eventArgs->getClassMetadata();
55
56
        $isPage     = is_a($classMetadata->getName(), $this->pageClass, true);
57
        $isCategory = is_a($classMetadata->getName(), $this->categoryClass, true);
58
59
        if ($isPage) {
60
            $this->processPageMetadata($classMetadata);
61
            $this->processParent($classMetadata, $this->pageClass);
62
            $this->processChildren($classMetadata, $this->pageClass);
63
        }
64
65
        if ($isCategory) {
66
            $this->processCategoryMetadata($classMetadata);
67
            $this->processParent($classMetadata, $this->categoryClass);
68
            $this->processChildren($classMetadata, $this->categoryClass);
69
        }
70
    }
71
72
    /**
73
     * Declare mapping for Page entity.
74
     *
75
     * @param ClassMetadata $classMetadata
76
     */
77
    private function processPageMetadata(ClassMetadata $classMetadata)
78
    {
79
        if (!$classMetadata->hasAssociation('category')) {
80
            $classMetadata->mapManyToOne([
81
                'fieldName'    => 'category',
82
                'targetEntity' => $this->categoryClass,
83
                'inversedBy'   => 'pages',
84
            ]);
85
        }
86
    }
87
88
    /**
89
     * Declare mapping for Category entity.
90
     *
91
     * @param ClassMetadata $classMetadata
92
     */
93
    private function processCategoryMetadata(ClassMetadata $classMetadata)
94
    {
95
        if (!$classMetadata->hasAssociation('pages')) {
96
            $classMetadata->mapOneToMany([
97
                'fieldName'    => 'pages',
98
                'targetEntity' => $this->pageClass,
99
                'mappedBy'     => 'category',
100
            ]);
101
        }
102
103
    }
104
105
    /**
106
     * Declare self-bidirectionnal mapping for parent.
107
     *
108
     * @param ClassMetadata $classMetadata
109
     * @param string        $class
110
     */
111
    private function processParent(ClassMetadata $classMetadata, $class)
112
    {
113
        if (!$classMetadata->hasAssociation('parent')) {
114
            $classMetadata->mapManyToOne([
115
                'fieldName'    => 'parent',
116
                'targetEntity' => $class,
117
                'inversedBy'   => 'children',
118
            ]);
119
        }
120
    }
121
122
    /**
123
     * Declare self-bidirectionnal mapping for children
124
     *
125
     * @param ClassMetadata $classMetadata
126
     * @param string        $class
127
     */
128
    private function processChildren(ClassMetadata $classMetadata, $class)
129
    {
130
        if (!$classMetadata->hasAssociation('children')) {
131
            $classMetadata->mapOneToMany([
132
                'fieldName'    => 'children',
133
                'targetEntity' => $class,
134
                'mappedBy'     => 'parent',
135
            ]);
136
        }
137
    }
138
}
139