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