1: <?php
2:
3: 4: 5: 6: 7: 8: 9: 10: 11:
12:
13:
14:
15: 16: 17: 18: 19: 20: 21:
22: class NRouteList extends NArrayList implements IRouter
23: {
24:
25: private $cachedRoutes;
26:
27:
28: private $module;
29:
30:
31:
32: public function __construct($module = NULL)
33: {
34: $this->module = $module ? $module . ':' : '';
35: }
36:
37:
38:
39: 40: 41: 42: 43:
44: public function match(IHttpRequest $httpRequest)
45: {
46: foreach ($this as $route) {
47: $appRequest = $route->match($httpRequest);
48: if ($appRequest !== NULL) {
49: $appRequest->setPresenterName($this->module . $appRequest->getPresenterName());
50: return $appRequest;
51: }
52: }
53: return NULL;
54: }
55:
56:
57:
58: 59: 60: 61: 62: 63:
64: public function constructUrl(NPresenterRequest $appRequest, NUrl $refUrl)
65: {
66: if ($this->cachedRoutes === NULL) {
67: $routes = array();
68: $routes['*'] = array();
69:
70: foreach ($this as $route) {
71: $presenter = $route instanceof NRoute ? $route->getTargetPresenter() : NULL;
72:
73: if ($presenter === FALSE) {
74: continue;
75: }
76:
77: if (is_string($presenter)) {
78: $presenter = strtolower($presenter);
79: if (!isset($routes[$presenter])) {
80: $routes[$presenter] = $routes['*'];
81: }
82: $routes[$presenter][] = $route;
83:
84: } else {
85: foreach ($routes as $id => $foo) {
86: $routes[$id][] = $route;
87: }
88: }
89: }
90:
91: $this->cachedRoutes = $routes;
92: }
93:
94: if ($this->module) {
95: if (strncasecmp($tmp = $appRequest->getPresenterName(), $this->module, strlen($this->module)) === 0) {
96: $appRequest = clone $appRequest;
97: $appRequest->setPresenterName(substr($tmp, strlen($this->module)));
98: } else {
99: return NULL;
100: }
101: }
102:
103: $presenter = strtolower($appRequest->getPresenterName());
104: if (!isset($this->cachedRoutes[$presenter])) {
105: $presenter = '*';
106: }
107:
108: foreach ($this->cachedRoutes[$presenter] as $route) {
109: $url = $route->constructUrl($appRequest, $refUrl);
110: if ($url !== NULL) {
111: return $url;
112: }
113: }
114:
115: return NULL;
116: }
117:
118:
119:
120: 121: 122: 123: 124: 125:
126: public function offsetSet($index, $route)
127: {
128: if (!$route instanceof IRouter) {
129: throw new InvalidArgumentException("Argument must be IRouter descendant.");
130: }
131: parent::offsetSet($index, $route);
132: }
133:
134:
135:
136: 137: 138:
139: public function getModule()
140: {
141: return $this->module;
142: }
143:
144: }
145: