Passed
Push — master ( 50699e...e44d99 )
by Steevan
02:35
created

onCreateEntityDefineFieldValues()   C

Complexity

Conditions 7
Paths 6

Size

Total Lines 23
Code Lines 13

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 23
rs 6.7272
c 0
b 0
f 0
cc 7
eloc 13
nc 6
nop 1
1
<?php
2
3
namespace steevanb\DoctrineEntityMerger\EventSubscriber;
4
5
use Doctrine\Common\EventSubscriber;
6
use Doctrine\ORM\Events;
7
use steevanb\DoctrineEntityMerger\QueryHint;
8
use steevanb\DoctrineEvents\Doctrine\ORM\Event\OnCreateEntityDefineFieldValuesEventArgs;
9
use steevanb\DoctrineEvents\Doctrine\ORM\Event\OnCreateEntityOverrideLocalValuesEventArgs;
10
11
class EntityMergerSubscriber implements EventSubscriber
12
{
13
    /** @var array */
14
    protected $definedFieldValues = [];
15
16
    /** @return array */
17
    public function getSubscribedEvents()
18
    {
19
        return [
20
            OnCreateEntityOverrideLocalValuesEventArgs::EVENT_NAME,
21
            OnCreateEntityDefineFieldValuesEventArgs::EVENT_NAME,
22
            Events::onClear
23
        ];
24
    }
25
26
    /** @param OnCreateEntityOverrideLocalValuesEventArgs $eventArgs */
27
    public function onCreateEntityOverrideLocalValues(OnCreateEntityOverrideLocalValuesEventArgs $eventArgs)
28
    {
29
        if ($this->haveMergeEntityHint($eventArgs->getHints())) {
30
            $eventArgs->setOverrideLocalValues(true);
31
        }
32
    }
33
34
    /** @param OnCreateEntityDefineFieldValuesEventArgs $eventArgs */
35
    public function onCreateEntityDefineFieldValues(OnCreateEntityDefineFieldValuesEventArgs $eventArgs)
36
    {
37
        $classMetadata = $eventArgs->getEntityManager()->getClassMetadata($eventArgs->getClassName());
38
        $entityHash = spl_object_hash($eventArgs->getEntity());
39
40
        if ($this->haveMergeEntityHint($eventArgs->getHints())) {
41
            foreach ($eventArgs->getData() as $field => $value) {
42
                if (
43
                    isset($classMetadata->fieldMappings[$field])
44
                    && isset($this->definedFieldValues[$entityHash][$field]) === false
45
                ) {
46
                    $classMetadata->reflFields[$field]->setValue($eventArgs->getEntity(), $value);
47
                    $this->definedFieldValues[$entityHash][$field] = true;
48
                }
49
            }
50
        }
51
52
        if (array_key_exists($entityHash, $this->definedFieldValues)) {
53
            foreach (array_keys($this->definedFieldValues[$entityHash]) as $field) {
54
                $eventArgs->addDefinedFieldValue($field);
55
            }
56
        }
57
    }
58
59
    public function onClear()
60
    {
61
        $this->definedFieldValues = [];
62
    }
63
64
    /**
65
     * @param array $hints
66
     * @return bool
67
     */
68
    protected function haveMergeEntityHint(array $hints)
69
    {
70
        return isset($hints[QueryHint::MERGE_ENTITY]);
71
    }
72
}
73