JsonRenderer::renderMenu()   A
last analyzed

Complexity

Conditions 2
Paths 2

Size

Total Lines 11
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 11
rs 9.4285
cc 2
eloc 5
nc 2
nop 1
1
<?php
2
3
namespace Roboc\Menu\Renderer;
4
5
use Roboc\Menu\Badge;
6
use Roboc\Menu\Item;
7
use Roboc\Menu\Menu;
8
use Roboc\Support\Interfaces\MenuItemInterface;
9
10
/**
11
 * Class JsonRenderer
12
 * @package Roboc\Menu\Renderer
13
 */
14
class JsonRenderer
15
{
16
    /**
17
     * @param Menu $menu
18
     * @return string
19
     */
20
    public function render( Menu $menu )
21
    {
22
        return json_encode( $this->renderMenu( $menu ) );
23
    }
24
25
    /**
26
     * @param Menu $menu
27
     * @return array
28
     */
29
    protected function renderMenu( Menu $menu )
30
    {
31
        $items = [ ];
32
33
        foreach( $menu->items() as $item )
34
        {
35
            $items[] = $this->renderItem( $item );
36
        }
37
38
        return $items;
39
    }
40
41
    /**
42
     * @param MenuItemInterface $item
43
     * @return array
44
     */
45
    protected function renderItem( MenuItemInterface $item )
46
    {
47
        /**
48
         * @var $item Item
49
         */
50
        $menuItem = [
51
            'title' => $item->getTitle(),
52
            'link' => $item->getLink(),
53
            'active' => $item->isActive(),
54
        ];
55
56
        if( $item->hasSubMenu() )
57
        {
58
            $menuItem['children'] = $this->renderMenu( $item->getSubMenu() );
59
        }
60
61
        if( $item->hasBadge() )
62
        {
63
            $menuItem['badge'] = $this->renderBadge( $item->getBadge() );
0 ignored issues
show
Bug introduced by
It seems like $item->getBadge() can be null; however, renderBadge() does not accept null, maybe add an additional type check?

Unless you are absolutely sure that the expression can never be null because of other conditions, we strongly recommend to add an additional type check to your code:

/** @return stdClass|null */
function mayReturnNull() { }

function doesNotAcceptNull(stdClass $x) { }

// With potential error.
function withoutCheck() {
    $x = mayReturnNull();
    doesNotAcceptNull($x); // Potential error here.
}

// Safe - Alternative 1
function withCheck1() {
    $x = mayReturnNull();
    if ( ! $x instanceof stdClass) {
        throw new \LogicException('$x must be defined.');
    }
    doesNotAcceptNull($x);
}

// Safe - Alternative 2
function withCheck2() {
    $x = mayReturnNull();
    if ($x instanceof stdClass) {
        doesNotAcceptNull($x);
    }
}
Loading history...
64
        }
65
66
        return array_filter( $menuItem );
67
    }
68
69
    /**
70
     * @param Badge $badge
71
     * @return array
0 ignored issues
show
Documentation introduced by
Consider making the return type a bit more specific; maybe use array<string,string|array>.

This check looks for the generic type array as a return type and suggests a more specific type. This type is inferred from the actual code.

Loading history...
72
     */
73
    protected function renderBadge( Badge $badge )
74
    {
75
        return [
76
            'value' => $badge->value(),
77
            'attributes' => $badge->attributes(),
78
        ];
79
    }
80
}
81