1: <?php
2:
3: 4: 5: 6: 7: 8: 9: 10: 11:
12:
13:
14:
15: 16: 17: 18: 19:
20: class SimpleRouter extends Object implements IRouter
21: {
22: const PRESENTER_KEY = 'presenter';
23: const MODULE_KEY = 'module';
24:
25:
26: private $module = '';
27:
28:
29: private $defaults;
30:
31:
32: private $flags;
33:
34:
35:
36: 37: 38: 39:
40: public function __construct($defaults = array(), $flags = 0)
41: {
42: if (is_string($defaults)) {
43: $a = strrpos($defaults, ':');
44: $defaults = array(
45: self::PRESENTER_KEY => substr($defaults, 0, $a),
46: 'action' => substr($defaults, $a + 1),
47: );
48: }
49:
50: if (isset($defaults[self::MODULE_KEY])) {
51: $this->module = $defaults[self::MODULE_KEY] . ':';
52: unset($defaults[self::MODULE_KEY]);
53: }
54:
55: $this->defaults = $defaults;
56: $this->flags = $flags;
57: }
58:
59:
60:
61: 62: 63: 64: 65:
66: public function match(IHttpRequest $httpRequest)
67: {
68: 69: $params = $httpRequest->getQuery();
70: $params += $this->defaults;
71:
72: if (!isset($params[self::PRESENTER_KEY])) {
73: throw new InvalidStateException('Missing presenter.');
74: }
75:
76: $presenter = $this->module . $params[self::PRESENTER_KEY];
77: unset($params[self::PRESENTER_KEY]);
78:
79: return new PresenterRequest(
80: $presenter,
81: $httpRequest->getMethod(),
82: $params,
83: $httpRequest->getPost(),
84: $httpRequest->getFiles(),
85: array(PresenterRequest::SECURED => $httpRequest->isSecured())
86: );
87: }
88:
89:
90:
91: 92: 93: 94: 95: 96:
97: public function constructUrl(PresenterRequest $appRequest, IHttpRequest $httpRequest)
98: {
99: $params = $appRequest->getParams();
100:
101: 102: $presenter = $appRequest->getPresenterName();
103: if (strncasecmp($presenter, $this->module, strlen($this->module)) === 0) {
104: $params[self::PRESENTER_KEY] = substr($presenter, strlen($this->module));
105: } else {
106: return NULL;
107: }
108:
109: 110: foreach ($this->defaults as $key => $value) {
111: if (isset($params[$key]) && $params[$key] == $value) { 112: unset($params[$key]);
113: }
114: }
115:
116: $uri = $httpRequest->getUri();
117: $uri = ($this->flags & self::SECURED ? 'https://' : 'http://') . $uri->getAuthority() . $uri->getScriptPath();
118: $sep = ini_get('arg_separator.input');
119: $query = http_build_query($params, '', $sep ? $sep[0] : '&');
120: if ($query != '') { 121: $uri .= '?' . $query;
122: }
123: return $uri;
124: }
125:
126:
127:
128: 129: 130: 131:
132: public function getDefaults()
133: {
134: return $this->defaults;
135: }
136:
137: }