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