1: <?php
2:
3: /**
4: * This file is part of the Nette Framework (http://nette.org)
5: *
6: * Copyright (c) 2004 David Grudl (http://davidgrudl.com)
7: *
8: * For the full copyright and license information, please view
9: * the file license.txt that was distributed with this source code.
10: * @package Nette\Application\Routers
11: */
12:
13:
14:
15: /**
16: * The router broker.
17: *
18: * @author David Grudl
19: * @property-read string $module
20: * @package Nette\Application\Routers
21: */
22: class NRouteList extends NArrayList implements IRouter
23: {
24: /** @var array */
25: private $cachedRoutes;
26:
27: /** @var string */
28: private $module;
29:
30:
31: public function __construct($module = NULL)
32: {
33: $this->module = $module ? $module . ':' : '';
34: }
35:
36:
37: /**
38: * Maps HTTP request to a Request object.
39: * @return NPresenterRequest|NULL
40: */
41: public function match(IHttpRequest $httpRequest)
42: {
43: foreach ($this as $route) {
44: $appRequest = $route->match($httpRequest);
45: if ($appRequest !== NULL) {
46: $appRequest->setPresenterName($this->module . $appRequest->getPresenterName());
47: return $appRequest;
48: }
49: }
50: return NULL;
51: }
52:
53:
54: /**
55: * Constructs absolute URL from Request object.
56: * @return string|NULL
57: */
58: public function constructUrl(NPresenterRequest $appRequest, NUrl $refUrl)
59: {
60: if ($this->cachedRoutes === NULL) {
61: $routes = array();
62: $routes['*'] = array();
63:
64: foreach ($this as $route) {
65: $presenter = $route instanceof NRoute ? $route->getTargetPresenter() : NULL;
66:
67: if ($presenter === FALSE) {
68: continue;
69: }
70:
71: if (is_string($presenter)) {
72: $presenter = strtolower($presenter);
73: if (!isset($routes[$presenter])) {
74: $routes[$presenter] = $routes['*'];
75: }
76: $routes[$presenter][] = $route;
77:
78: } else {
79: foreach ($routes as $id => $foo) {
80: $routes[$id][] = $route;
81: }
82: }
83: }
84:
85: $this->cachedRoutes = $routes;
86: }
87:
88: if ($this->module) {
89: if (strncasecmp($tmp = $appRequest->getPresenterName(), $this->module, strlen($this->module)) === 0) {
90: $appRequest = clone $appRequest;
91: $appRequest->setPresenterName(substr($tmp, strlen($this->module)));
92: } else {
93: return NULL;
94: }
95: }
96:
97: $presenter = strtolower($appRequest->getPresenterName());
98: if (!isset($this->cachedRoutes[$presenter])) {
99: $presenter = '*';
100: }
101:
102: foreach ($this->cachedRoutes[$presenter] as $route) {
103: $url = $route->constructUrl($appRequest, $refUrl);
104: if ($url !== NULL) {
105: return $url;
106: }
107: }
108:
109: return NULL;
110: }
111:
112:
113: /**
114: * Adds the router.
115: * @param mixed
116: * @param IRouter
117: * @return void
118: */
119: public function offsetSet($index, $route)
120: {
121: if (!$route instanceof IRouter) {
122: throw new InvalidArgumentException("Argument must be IRouter descendant.");
123: }
124: parent::offsetSet($index, $route);
125: }
126:
127:
128: /**
129: * @return string
130: */
131: public function getModule()
132: {
133: return $this->module;
134: }
135:
136: }
137: