Router::addToRouteResultMapping()   A
last analyzed

Complexity

Conditions 4
Paths 4

Size

Total Lines 13
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 9
CRAP Score 4.016

Importance

Changes 2
Bugs 0 Features 0
Metric Value
c 2
b 0
f 0
dl 0
loc 13
ccs 9
cts 10
cp 0.9
rs 9.2
cc 4
eloc 9
nc 4
nop 1
crap 4.016
1
<?php
2
3
  namespace ReRoute;
4
5
  use ReRoute\Exceptions\MatchNotFoundException;
6
  use ReRoute\Route\FinalRoute;
7
  use ReRoute\Route\AbstractRoute;
8
  use ReRoute\Route\RouteGroup;
9
10
11
  /**
12
   *
13
   * @package ReRoute
14
   */
15
  class Router {
16
17
    /**
18
     * @var string
19
     */
20
    protected $methodOverride = '';
21
22
    /**
23
     * @var AbstractRoute[]
24
     */
25
    protected $resultToRouteMapping = [];
26
27
    /**
28
     * @var AbstractRoute[]
29
     */
30
    protected $routes = [];
31
32
33
    /**
34
     * @param AbstractRoute $route
35
     *
36
     * @return $this
37
     */
38 72
    public function addRoute(AbstractRoute $route) {
39 72
      $this->addToRouteResultMapping($route);
40 72
      $this->routes[] = $route;
41 72
      return $this;
42
    }
43
44
45
    /**
46
     * @return AbstractRoute[]
47
     */
48 51
    public function getRoutes() {
49 51
      return $this->routes;
50
    }
51
52
53
    /**
54
     * @param AbstractRoute $route
55
     */
56 72
    private function addToRouteResultMapping(AbstractRoute $route) {
57 72
      if ($route instanceof FinalRoute) {
58 72
        $this->resultToRouteMapping[$route->getResult()] = $route;
59 72
        return;
60
      }
61 45
      if ($route instanceof RouteGroup) {
62 45
        foreach ($route->getRoutes() as $childRoute) {
63 45
          $this->addToRouteResultMapping($childRoute);
64 45
        }
65 45
        return;
66
      }
67
      throw new \InvalidArgumentException('Route type should be "' . FinalRoute::class . '" or "' . RouteGroup::class . '"');
68
    }
69
70
71
    /**
72
     * @param string $routeResult
73
     * @return UrlBuilder
74
     * @deprecated
75
     * @see urlBuilder
76
     */
77
    public function getUrl($routeResult) {
78
      return $this->urlBuilder($routeResult);
79
    }
80
81
82
    /**
83
     * @param string $routeResult
84
     * @return UrlBuilder
85
     */
86 33
    public function urlBuilder($routeResult) {
87 33
      if (!isset($this->resultToRouteMapping[$routeResult])) {
88 3
        throw new \InvalidArgumentException('No route: ' . $routeResult);
89
      }
90 30
      return $this->resultToRouteMapping[$routeResult]->getUrl();
91
    }
92
93
94
    /**
95
     * @param string $routeResult
96
     * @param array $options
97
     * @return string
98
     */
99 6
    public function generateUrl($routeResult, array $options = []) {
100 6
      $urlBuilder = $this->urlBuilder($routeResult);
101 6
      foreach ($options as $key => $value) {
102 3
        $urlBuilder->setParameter($key, $value);
103 6
      }
104 6
      return $urlBuilder->assemble();
105
    }
106
107
108
    /**
109
     * @return string
110
     */
111
    public function getMethodOverride() {
112
      return $this->methodOverride;
113
    }
114
115
116
    /**
117
     * @param string $methodOverride
118
     */
119 6
    public function setMethodOverride($methodOverride) {
120 6
      $this->methodOverride = (string) $methodOverride;
121 6
    }
122
123
124
    /**
125
     * @param RequestContext $requestContext
126
     * @return RouteMatch
127
     * @throws MatchNotFoundException
128
     */
129 48
    public function doMatch(RequestContext $requestContext) {
130 48
      if (!empty($this->methodOverride)) {
131 6
        if ($method = $requestContext->getParameter($this->methodOverride)) {
132 3
          $requestContext->setMethod($method);
133 3
        }
134 6
      }
135 48
      foreach ($this->getRoutes() as $route) {
136 48
        $routeMatch = $route->doMatch($requestContext);
137 48
        if ($routeMatch instanceof RouteMatch) {
138 27
          break;
139
        }
140 48
      }
141 48
      if (empty($routeMatch) or !($routeMatch instanceof RouteMatch)) {
142 21
        throw new MatchNotFoundException('Route not found for: ' . $requestContext->getPath());
143
      }
144
145 27
      return $routeMatch;
146
    }
147
148
149
  }