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: public function match(IHttpRequest $httpRequest)
44: {
45: foreach ($this as $route) {
46: $appRequest = $route->match($httpRequest);
47: if ($appRequest !== NULL) {
48: $appRequest->setPresenterName($this->module . $appRequest->getPresenterName());
49: return $appRequest;
50: }
51: }
52: return NULL;
53: }
54:
55:
56:
57: 58: 59: 60:
61: public function constructUrl(NPresenterRequest $appRequest, NUrl $refUrl)
62: {
63: if ($this->cachedRoutes === NULL) {
64: $routes = array();
65: $routes['*'] = array();
66:
67: foreach ($this as $route) {
68: $presenter = $route instanceof NRoute ? $route->getTargetPresenter() : NULL;
69:
70: if ($presenter === FALSE) {
71: continue;
72: }
73:
74: if (is_string($presenter)) {
75: $presenter = strtolower($presenter);
76: if (!isset($routes[$presenter])) {
77: $routes[$presenter] = $routes['*'];
78: }
79: $routes[$presenter][] = $route;
80:
81: } else {
82: foreach ($routes as $id => $foo) {
83: $routes[$id][] = $route;
84: }
85: }
86: }
87:
88: $this->cachedRoutes = $routes;
89: }
90:
91: if ($this->module) {
92: if (strncasecmp($tmp = $appRequest->getPresenterName(), $this->module, strlen($this->module)) === 0) {
93: $appRequest = clone $appRequest;
94: $appRequest->setPresenterName(substr($tmp, strlen($this->module)));
95: } else {
96: return NULL;
97: }
98: }
99:
100: $presenter = strtolower($appRequest->getPresenterName());
101: if (!isset($this->cachedRoutes[$presenter])) {
102: $presenter = '*';
103: }
104:
105: foreach ($this->cachedRoutes[$presenter] as $route) {
106: $url = $route->constructUrl($appRequest, $refUrl);
107: if ($url !== NULL) {
108: return $url;
109: }
110: }
111:
112: return NULL;
113: }
114:
115:
116:
117: 118: 119: 120: 121: 122:
123: public function offsetSet($index, $route)
124: {
125: if (!$route instanceof IRouter) {
126: throw new InvalidArgumentException("Argument must be IRouter descendant.");
127: }
128: parent::offsetSet($index, $route);
129: }
130:
131:
132:
133: 134: 135:
136: public function getModule()
137: {
138: return $this->module;
139: }
140:
141: }
142: