Linkable::link()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 3
CRAP Score 1

Importance

Changes 0
Metric Value
dl 0
loc 4
ccs 3
cts 3
cp 1
rs 10
c 0
b 0
f 0
cc 1
eloc 2
nc 1
nop 2
crap 1
1
<?php namespace NukaCode\Menu\Traits;
2
3
use NukaCode\Menu\Link;
4
use NukaCode\Menu\DropDown;
5
6
/**
7
 * Class Linkable
8
 *
9
 * @package NukaCode\Menu\Traits
10
 */
11
trait Linkable {
12
13
    /**
14
     * Parent menu object
15
     *
16
     * @var Menu
17
     */
18
    public $menu;
19
20
    /**
21
     * The menu links
22
     *
23
     * @var \Illuminate\Support\Collection
24
     */
25
    public $links = 'links NEEDS TO BE SET TO A COLLECTION';
26
27
    /**
28
     * @param $slug
29
     * @param $name
30
     * @param $callback
31
     */
32 4
    public function dropDown($slug, $name, $callback)
33
    {
34 4
        $dropDown = new DropDown();
35 4
        $dropDown->name = $name;
36
37 4
        $this->insertMenuObject($slug, $callback, $dropDown);
38 4
    }
39
40
    /**
41
     * @param $slug
42
     * @param $callback
43
     *
44
     * @throws \Exception
45
     */
46 2
    public function getDropDown($slug, $callback)
47
    {
48 2
        $dropDown = $this->links->where('slug', $this->snakeName($slug))->first();
49
50 2
        if ($dropDown) {
51 1
            call_user_func($callback, $dropDown);
52 1
        } else {
53 1
            throw new \Exception("Drop down {$slug} not found");
54
        }
55 1
    }
56
57
    /**
58
     * @param $slug
59
     * @param $callback
60
     */
61 9
    public function link($slug, $callback)
62
    {
63 9
        $this->insertMenuObject($slug, $callback, (new Link));
64 9
    }
65
66
    /**
67
     * Get the menu this linkable belongs to
68
     *
69
     * @return Menu
70
     */
71 10
    private function getMenu()
72
    {
73 10
        if (isset($this->menu)) {
74 3
            return $this->menu;
75
        }
76
77 10
        return $this;
78
    }
79
80
    /**
81
     * Sanitize the menus names for safe use in array keys.
82
     *
83
     * @param $name
84
     *
85
     * @return string
86
     */
87 11
    public function snakeName($name)
88
    {
89 11
        return e(snake_case($name));
90
    }
91
92
    /**
93
     * Insert an object into the menu
94
     *
95
     * @param $slug
96
     * @param $callback
97
     * @param $object
98
     */
99 10
    private function insertMenuObject($slug, $callback, $object)
100
    {
101 10
        $object->slug = $this->snakeName($slug);
102 10
        $object->menu = $this->getMenu();
103
104 10
        call_user_func($callback, $object);
105
106 10
        if (!$object->insert) {
107 10
            $this->links[] = $object;
108 10
        }
109
    }
110
}