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: public function __construct($defaults = array(), $flags = 0)
44: {
45: if (is_string($defaults)) {
46: $a = strrpos($defaults, ':');
47: if (!$a) {
48: throw new InvalidArgumentException("Argument must be array or string in format Presenter:action, '$defaults' given.");
49: }
50: $defaults = array(
51: self::PRESENTER_KEY => substr($defaults, 0, $a),
52: 'action' => $a === strlen($defaults) - 1 ? Presenter::DEFAULT_ACTION : substr($defaults, $a + 1),
53: );
54: }
55:
56: if (isset($defaults[self::MODULE_KEY])) {
57: $this->module = $defaults[self::MODULE_KEY] . ':';
58: unset($defaults[self::MODULE_KEY]);
59: }
60:
61: $this->defaults = $defaults;
62: $this->flags = $flags;
63: }
64:
65:
66: 67: 68: 69:
70: public function match(IHttpRequest $httpRequest)
71: {
72: if ($httpRequest->getUrl()->getPathInfo() !== '') {
73: return NULL;
74: }
75:
76: $params = $httpRequest->getQuery();
77: $params += $this->defaults;
78:
79: if (!isset($params[self::PRESENTER_KEY]) || !is_string($params[self::PRESENTER_KEY])) {
80: return NULL;
81: }
82:
83: $presenter = $this->module . $params[self::PRESENTER_KEY];
84: unset($params[self::PRESENTER_KEY]);
85:
86: return new PresenterRequest(
87: $presenter,
88: $httpRequest->getMethod(),
89: $params,
90: $httpRequest->getPost(),
91: $httpRequest->getFiles(),
92: array(PresenterRequest::SECURED => $httpRequest->isSecured())
93: );
94: }
95:
96:
97: 98: 99: 100:
101: public function constructUrl(PresenterRequest $appRequest, Url $refUrl)
102: {
103: if ($this->flags & self::ONE_WAY) {
104: return NULL;
105: }
106: $params = $appRequest->getParameters();
107:
108:
109: $presenter = $appRequest->getPresenterName();
110: if (strncasecmp($presenter, $this->module, strlen($this->module)) === 0) {
111: $params[self::PRESENTER_KEY] = substr($presenter, strlen($this->module));
112: } else {
113: return NULL;
114: }
115:
116:
117: foreach ($this->defaults as $key => $value) {
118: if (isset($params[$key]) && $params[$key] == $value) {
119: unset($params[$key]);
120: }
121: }
122:
123: $url = ($this->flags & self::SECURED ? 'https://' : 'http://') . $refUrl->getAuthority() . $refUrl->getPath();
124: $sep = ini_get('arg_separator.input');
125: $query = http_build_query($params, '', $sep ? $sep[0] : '&');
126: if ($query != '') {
127: $url .= '?' . $query;
128: }
129: return $url;
130: }
131:
132:
133: 134: 135: 136:
137: public function getDefaults()
138: {
139: return $this->defaults;
140: }
141:
142:
143: 144: 145: 146:
147: public function getFlags()
148: {
149: return $this->flags;
150: }
151:
152: }
153: