-
-
Notifications
You must be signed in to change notification settings - Fork 115
Expand file tree
/
Copy pathRouteList.php
More file actions
124 lines (100 loc) · 2.56 KB
/
RouteList.php
File metadata and controls
124 lines (100 loc) · 2.56 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
<?php
/**
* This file is part of the Nette Framework (http://nette.org)
* Copyright (c) 2004 David Grudl (http://davidgrudl.com)
*/
namespace Nette\Application\Routers;
use Nette;
/**
* The router broker.
*/
class RouteList extends Nette\Utils\ArrayList implements Nette\Application\IRouter, Nette\Application\IRouteList
{
/** @var array */
private $cachedRoutes;
/** @var string */
private $module;
public function __construct($module = NULL)
{
$this->module = $module ? $module . ':' : '';
}
/**
* Maps HTTP request to a Request object.
* @return Nette\Application\Request|NULL
*/
public function match(Nette\Http\IRequest $httpRequest)
{
foreach ($this as $route) {
$appRequest = $route->match($httpRequest);
if ($appRequest !== NULL) {
$name = $appRequest->getPresenterName();
if (strncmp($name, 'Nette:', 6)) {
$appRequest->setPresenterName($this->module . $name);
}
return $appRequest;
}
}
return NULL;
}
/**
* Constructs absolute URL from Request object.
* @return string|NULL
*/
public function constructUrl(Nette\Application\Request $appRequest, Nette\Http\Url $refUrl)
{
if ($this->cachedRoutes === NULL) {
$routes = [];
$routes['*'] = [];
foreach ($this as $route) {
$presenters = $route instanceof Route && is_array($tmp = $route->getTargetPresenters())
? $tmp : array_keys($routes);
foreach ($presenters as $presenter) {
if (!isset($routes[$presenter])) {
$routes[$presenter] = $routes['*'];
}
$routes[$presenter][] = $route;
}
}
$this->cachedRoutes = $routes;
}
if ($this->module) {
if (strncmp($tmp = $appRequest->getPresenterName(), $this->module, strlen($this->module)) === 0) {
$appRequest = clone $appRequest;
$appRequest->setPresenterName(substr($tmp, strlen($this->module)));
} else {
return NULL;
}
}
$presenter = $appRequest->getPresenterName();
if (!isset($this->cachedRoutes[$presenter])) {
$presenter = '*';
}
foreach ($this->cachedRoutes[$presenter] as $route) {
$url = $route->constructUrl($appRequest, $refUrl);
if ($url !== NULL) {
return $url;
}
}
return NULL;
}
/**
* Adds the router.
* @param mixed
* @param Nette\Application\IRouter
* @return void
*/
public function offsetSet($index, $route)
{
if (!$route instanceof Nette\Application\IRouter) {
throw new Nette\InvalidArgumentException('Argument must be IRouter descendant.');
}
parent::offsetSet($index, $route);
}
/**
* @return string
*/
public function getModule()
{
return $this->module;
}
}