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