Cloner::handle()   A
last analyzed

Complexity

Conditions 2
Paths 2

Size

Total Lines 12
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 12
rs 9.4285
c 0
b 0
f 0
cc 2
eloc 6
nc 2
nop 1
1
<?php
2
/**
3
 * @year    2016
4
 * @link    https://github.com/nnx-framework/cloner
5
 * @author  Lobanov Aleksandr <[email protected]>
6
 */
7
8
namespace Nnx\Cloner;
9
10
use Assert\Assertion;
11
12
/**
13
 * Class Cloner
14
 *
15
 * @package Nnx\Cloner
16
 */
17
class Cloner implements ClonerInterface
18
{
19
20
    /**
21
     * @var ClonerManagerInterface
22
     */
23
    private $clonerManager;
24
25
    /**
26
     * @var Options\ClonerOptions
27
     */
28
    private $options;
29
30
    /**
31
     * Cloner constructor.
32
     *
33
     * @param ClonerManagerInterface       $clonerManager
34
     * @param Options\ClonerOptions $options
35
     */
36
    public function __construct(ClonerManagerInterface $clonerManager, Options\ClonerOptions $options)
37
    {
38
        $this->clonerManager = $clonerManager;
39
        $this->options = $options;
40
    }
41
42
    /**
43
     * @param mixed
44
     *
45
     * @return mixed Объект для обработки
46
     */
47
    public function handle($object)
48
    {
49
        Assertion::isObject($object);
50
51
        $this->afterClone($object);
52
53
        foreach ($this->getOptions()->getRelations() as $relationName => $relation) {
54
            $this->handleRelation($object, $relationName, $relation);
55
        }
56
57
        return $object;
58
    }
59
60
    /**
61
     * @param mixed                          $object
62
     * @param string                         $relationName
63
     * @param Options\Cloner\RelationOptions $options
64
     *
65
     * @return mixed
66
     */
67
    protected function handleRelation($object, $relationName, Options\Cloner\RelationOptions $options)
68
    {
69
        $relationGetter = 'get' . ucfirst($relationName);
70
        Assertion::methodExists($relationGetter, $object);
71
72
        $relationData = $object->$relationGetter();
73
        if ($relationData === null) {
74
            return null;
75
        }
76
77
        if (is_array($relationData)
78
            || $relationData instanceof \Traversable
79
        ) {
80
            $cloneData = [];
81
            foreach ($relationData as $data) {
82
                if ($relationResult= $this->getRelationClonerResult($options->getClonerName(), $data)) {
83
                    $cloneData[] = $relationResult;
84
                }
85
            }
86
        } else {
87
            $cloneData = $this->getRelationClonerResult($options->getClonerName(), $relationData);
88
        }
89
        return $cloneData;
90
    }
91
92
    /**
93
     * @param string $clonerName
94
     * @param mixed  $relationData
95
     *
96
     * @return mixed
97
     */
98
    protected function getRelationClonerResult($clonerName, $relationData)
99
    {
100
        $cloner = $this->getClonerManager()->get($clonerName);
101
        return $cloner->handle($relationData);
102
    }
103
104
    /**
105
     * @param mixed $object      объект для обработки
106
     */
107
    protected function afterClone($object)
0 ignored issues
show
Unused Code introduced by
The parameter $object is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
108
    {
109
    }
110
111
    /**
112
     * @return ClonerManagerInterface
113
     */
114
    protected function getClonerManager()
115
    {
116
        return $this->clonerManager;
117
    }
118
119
    /**
120
     * @return Options\ClonerOptions
121
     */
122
    protected function getOptions()
123
    {
124
        return $this->options;
125
    }
126
}
127