RouteTracker   A
last analyzed

Complexity

Total Complexity 23

Size/Duplication

Total Lines 196
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 9

Test Coverage

Coverage 91.84%

Importance

Changes 0
Metric Value
wmc 23
lcom 1
cbo 9
dl 0
loc 196
rs 10
c 0
b 0
f 0
ccs 45
cts 49
cp 0.9184

11 Methods

Rating   Name   Duplication   Size   Complexity  
A getModel() 0 4 1
A isTrackable() 0 5 2
A trackRoute() 0 7 1
A getRouteName() 0 4 2
A track() 0 6 1
A isInIgnoredRouteNames() 0 6 1
A isInIgnoredUris() 0 6 1
A checkPatterns() 0 8 3
A trackRoutePath() 0 13 2
A trackRoutePathParameters() 0 16 4
B checkIfValueIsEloquentModel() 0 15 5
1
<?php namespace Arcanedev\LaravelTracker\Trackers;
2
3
use Arcanedev\LaravelTracker\Contracts\Trackers\RouteTracker as RouteTrackerContract;
4
use Arcanedev\LaravelTracker\Models;
5
use Arcanedev\LaravelTracker\Support\BindingManager;
6
use Illuminate\Database\Eloquent\Model as EloquentModel;
7
use Illuminate\Http\Request;
8
use Illuminate\Routing\Route;
9
use Illuminate\Support\Str;
10
11
/**
12
 * Class     RouteTracker
13
 *
14
 * @package  Arcanedev\LaravelTracker\Trackers
15
 * @author   ARCANEDEV <[email protected]>
16
 */
17
class RouteTracker extends AbstractTracker implements RouteTrackerContract
18
{
19
    /* -----------------------------------------------------------------
20
     |  Getters and Setters
21
     | -----------------------------------------------------------------
22
     */
23
24
    /**
25
     * Get the model.
26
     *
27
     * @return \Arcanedev\LaravelTracker\Models\Route
28
     */
29 9
    protected function getModel()
30
    {
31 9
        return $this->makeModel(BindingManager::MODEL_ROUTE);
32
    }
33
34
    /* -----------------------------------------------------------------
35
     |  Main Methods
36
     | -----------------------------------------------------------------
37
     */
38
39
    /**
40
     * Check if the route is trackable.
41
     *
42
     * @param  \Illuminate\Routing\Route $route
43
     *
44
     * @return bool
45
     */
46 9
    public function isTrackable(Route $route)
47
    {
48 9
        return ! $this->isInIgnoredRouteNames($route) &&
49 9
               ! $this->isInIgnoredUris($route);
50
    }
51
52
    /**
53
     * Track the matched route.
54
     *
55
     * @param  \Illuminate\Routing\Route  $route
56
     * @param  \Illuminate\Http\Request   $request
57
     *
58
     * @return int
59
     */
60 9
    public function track(Route $route, Request $request)
61
    {
62 9
        return $this->trackRoutePath(
63 9
            $route, $request, $this->trackRoute($route)
64
        );
65
    }
66
67
    /* -----------------------------------------------------------------
68
     |  Other Methods
69
     | -----------------------------------------------------------------
70
     */
71
72
    /**
73
     * Track the current route.
74
     *
75
     * @param  \Illuminate\Routing\Route  $route
76
     *
77
     * @return int
78
     */
79 9
    private function trackRoute(Route $route)
80
    {
81 9
        return $this->getModel()->newQuery()->firstOrCreate([
82 9
            'name'   => $this->getRouteName($route),
83 9
            'action' => $route->getActionName(),
84 9
        ])->getKey();
85
    }
86
87
    /**
88
     * Check if the route is ignored by a route pattern.
89
     *
90
     * @param  \Illuminate\Routing\Route  $route
91
     *
92
     * @return bool
93
     */
94 9
    private function isInIgnoredRouteNames(Route $route)
95
    {
96 9
        return $this->checkPatterns(
97 9
            $route->getName(), $this->getConfig('routes.ignore.names', [])
98
        );
99
    }
100
101
    /**
102
     * Check if the route is ignored by a route pattern.
103
     *
104
     * @param  \Illuminate\Routing\Route  $route
105
     *
106
     * @return bool
107
     */
108 9
    private function isInIgnoredUris(Route $route)
109
    {
110 9
        return $this->checkPatterns(
111 9
            $route->uri(), $this->getConfig('routes.ignore.uris', [])
112
        );
113
    }
114
115
    /**
116
     * Check if the value match the given patterns.
117
     *
118
     * @param  string|null  $value
119
     * @param  array        $patterns
120
     *
121
     * @return bool
122
     */
123 9
    private function checkPatterns($value, array $patterns)
124
    {
125 9
        foreach ($patterns as $pattern) {
126 9
            if (Str::is($pattern, $value)) return true;
127
        }
128
129 9
        return false;
130
    }
131
132
    /**
133
     * Get the route name.
134
     *
135
     * @param  \Illuminate\Routing\Route  $route
136
     *
137
     * @return string
138
     */
139 9
    private function getRouteName(Route $route)
140
    {
141 9
        return is_null($name = $route->getName()) ? $route->uri() : $name;
142
    }
143
144
    /**
145
     * Track the route path.
146
     *
147
     * @param  \Illuminate\Routing\Route  $route
148
     * @param  \Illuminate\Http\Request   $request
149
     * @param  int                        $routeId
150
     *
151
     * @return int
152
     */
153 9
    private function trackRoutePath(Route $route, Request $request, $routeId)
154
    {
155
        /** @var  \Arcanedev\LaravelTracker\Models\RoutePath  $model */
156 9
        $model = $this->makeModel(BindingManager::MODEL_ROUTE_PATH)->firstOrCreate([
157 9
            'route_id' => $routeId,
158 9
            'path'     => $request->path(),
159
        ]);
160
161 9
        if ($model->wasRecentlyCreated)
162 9
            $this->trackRoutePathParameters($route, $model);
163
164 9
        return $model->getKey();
165
    }
166
167
    /**
168
     * Track the route path parameters.
169
     *
170
     * @param  \Illuminate\Routing\Route                   $route
171
     * @param  \Arcanedev\LaravelTracker\Models\RoutePath  $routePath
172
     */
173 9
    private function trackRoutePathParameters(Route $route, Models\RoutePath $routePath)
174
    {
175 9
        $parameters = [];
176
177 9
        if ($route->hasParameters()) {
178 6
            foreach ($route->parameters() as $parameter => $value) {
179 3
                $parameters[] = $this->makeModel(BindingManager::MODEL_ROUTE_PATH_PARAMETER)->fill([
180 3
                    'parameter' => $parameter,
181 3
                    'value'     => $this->checkIfValueIsEloquentModel($value),
182
                ]);
183
            }
184
        }
185
186 9
        if (count($parameters) > 0)
187 3
            $routePath->parameters()->saveMany($parameters);
188 9
    }
189
190
    /**
191
     * Check if the value is an eloquent model.
192
     *
193
     * @param  mixed  $value
194
     *
195
     * @return mixed
196
     */
197 3
    private function checkIfValueIsEloquentModel($value)
198
    {
199 3
        if ($value instanceof EloquentModel) {
200
            foreach ($this->getConfig('routes.model-columns', ['id']) as $column) {
201
                if (
202
                    array_key_exists($column, $attributes = $value->getAttributes()) &&
203
                    ! is_null($attributes[$column])
204
                ) {
205
                    return $attributes[$column];
206
                }
207
            }
208
        }
209
210 3
        return $value;
211
    }
212
}
213