1: <?php
2:
3: 4: 5: 6: 7: 8: 9: 10:
11:
12: namespace Nette\Application;
13:
14: use Nette;
15:
16:
17:
18: 19: 20: 21: 22:
23: class MultiRouter extends Nette\ArrayList implements IRouter
24: {
25:
26: private $cachedRoutes;
27:
28:
29:
30: 31: 32: 33: 34:
35: public function match(Nette\Web\IHttpRequest $httpRequest)
36: {
37: foreach ($this as $route) {
38: $appRequest = $route->match($httpRequest);
39: if ($appRequest !== NULL) {
40: return $appRequest;
41: }
42: }
43: return NULL;
44: }
45:
46:
47:
48: 49: 50: 51: 52: 53:
54: public function constructUrl(PresenterRequest $appRequest, Nette\Web\IHttpRequest $httpRequest)
55: {
56: if ($this->cachedRoutes === NULL) {
57: $routes = array();
58: $routes['*'] = array();
59:
60: foreach ($this as $route) {
61: $presenter = $route instanceof Route ? $route->getTargetPresenter() : NULL;
62:
63: if ($presenter === FALSE) continue;
64:
65: if (is_string($presenter)) {
66: $presenter = strtolower($presenter);
67: if (!isset($routes[$presenter])) {
68: $routes[$presenter] = $routes['*'];
69: }
70: $routes[$presenter][] = $route;
71:
72: } else {
73: foreach ($routes as $id => $foo) {
74: $routes[$id][] = $route;
75: }
76: }
77: }
78:
79: $this->cachedRoutes = $routes;
80: }
81:
82: $presenter = strtolower($appRequest->getPresenterName());
83: if (!isset($this->cachedRoutes[$presenter])) $presenter = '*';
84:
85: foreach ($this->cachedRoutes[$presenter] as $route) {
86: $uri = $route->constructUrl($appRequest, $httpRequest);
87: if ($uri !== NULL) {
88: return $uri;
89: }
90: }
91:
92: return NULL;
93: }
94:
95:
96:
97: 98: 99: 100: 101: 102:
103: public function offsetSet($index, $route)
104: {
105: if (!($route instanceof IRouter)) {
106: throw new \InvalidArgumentException("Argument must be IRouter descendant.");
107: }
108: parent::offsetSet($index, $route);
109: }
110:
111: }
112: