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