MenuOrdener::handle()   A
last analyzed

Complexity

Conditions 2
Paths 2

Size

Total Lines 8
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 8
rs 9.4286
cc 2
eloc 4
nc 2
nop 1
1
<?php namespace Modules\Menu\Services;
2
3
use Modules\Menu\Entities\Menuitem;
4
use Modules\Menu\Repositories\MenuItemRepository;
5
6
class MenuOrdener
7
{
8
    /**
9
     * @var MenuItemRepository
10
     */
11
    private $menuItemRepository;
12
13
    /**
14
     * @param MenuItemRepository $menuItem
15
     */
16
    public function __construct(MenuItemRepository $menuItem)
17
    {
18
        $this->menuItemRepository = $menuItem;
19
    }
20
21
    /**
22
     * @param $data
23
     */
24
    public function handle($data)
25
    {
26
        $data = $this->convertToArray(json_decode($data));
27
28
        foreach ($data as $position => $item) {
29
            $this->order($position, $item);
30
        }
31
    }
32
33
    /**
34
     * Order recursively the menu items
35
     * @param int   $position
36
     * @param array $item
37
     */
38
    private function order($position, $item)
39
    {
40
        $menuItem = $this->menuItemRepository->find($item['id']);
41
        if (0 === $position && false === $menuItem->isRoot()) {
42
            return;
43
        }
44
        $this->savePosition($menuItem, $position);
45
        $this->makeItemChildOf($menuItem, null);
46
47
        if ($this->hasChildren($item)) {
48
            $this->handleChildrenForParent($menuItem, $item['children']);
49
        }
50
    }
51
52
    /**
53
     * @param Menuitem $parent
54
     * @param array    $children
55
     */
56
    private function handleChildrenForParent(Menuitem $parent, array $children)
57
    {
58
        foreach ($children as $position => $item) {
59
            $menuItem = $this->menuItemRepository->find($item['id']);
60
            $this->savePosition($menuItem, $position);
61
            $this->makeItemChildOf($menuItem, $parent->id);
0 ignored issues
show
Documentation introduced by
The property id does not exist on object<Modules\Menu\Entities\Menuitem>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
62
63
            if ($this->hasChildren($item)) {
64
                $this->handleChildrenForParent($menuItem, $item['children']);
65
            }
66
        }
67
    }
68
69
    /**
70
     * Save the given position on the menu item
71
     * @param object $menuItem
72
     * @param int    $position
73
     */
74
    private function savePosition($menuItem, $position)
75
    {
76
        $this->menuItemRepository->update($menuItem, compact('position'));
77
    }
78
79
    /**
80
     * Check if the item has children
81
     *
82
     * @param  array $item
83
     * @return bool
84
     */
85
    private function hasChildren($item)
86
    {
87
        return isset($item['children']);
88
    }
89
90
    /**
91
     * Set the given parent id on the given menu item
92
     *
93
     * @param object $item
94
     * @param int    $parent_id
95
     */
96
    private function makeItemChildOf($item, $parent_id)
97
    {
98
        $this->menuItemRepository->update($item, compact('parent_id'));
99
    }
100
101
    /**
102
     * Convert the object to array
103
     * @param $data
104
     * @return array
105
     */
106
    private function convertToArray($data)
107
    {
108
        $data = json_decode(json_encode($data), true);
109
110
        return $data;
111
    }
112
}
113