00001 <?php
00003
00004
00005
00006
00007
00008
00010
00027 class FLEA_Dispatcher_Simple
00028 {
00034 var $_request;
00035
00041 var $_requestBackup;
00042
00050 function FLEA_Dispatcher_Simple(& $request)
00051 {
00052 $this->_requestBackup =& $request;
00053
00054 $controllerAccessor = strtolower(FLEA::getAppInf('controllerAccessor'));
00055 $actionAccessor = strtolower(FLEA::getAppInf('actionAccessor'));
00056
00057 $r = array_change_key_case($request, CASE_LOWER);
00058 $data = array('controller' => null, 'action' => null);
00059 if (isset($r[$controllerAccessor])) {
00060 $data['controller'] = $r[$controllerAccessor];
00061 }
00062 if (isset($r[$actionAccessor])) {
00063 $data['action'] = $r[$actionAccessor];
00064 }
00065 $this->_request = $data;
00066 }
00067
00073 function dispatching()
00074 {
00075 $controllerName = $this->getControllerName();
00076 $actionName = $this->getActionName();
00077 return $this->_executeAction($controllerName, $actionName, $this->getControllerClass($controllerName));
00078 }
00079
00089 function _executeAction($controllerName, $actionName, $controllerClass)
00090 {
00091 $callback = FLEA::getAppInf('dispatcherFailedCallback');
00092
00093
00094 $actionPrefix = FLEA::getAppInf('actionMethodPrefix');
00095 $actionMethod = $actionPrefix . $actionName . FLEA::getAppInf('actionMethodSuffix');
00096
00097 $controller = null;
00098 $controllerClassFilename = null;
00099 do {
00100
00101 if (!$this->_loadController($controllerClass)) { break; }
00102
00103
00104 FLEA::setAppInf('FLEA.internal.currentControllerName', $controllerName);
00105 FLEA::setAppInf('FLEA.internal.currentActionName', $actionName);
00106 $controller =& new $controllerClass($controllerName);
00107 if (!method_exists($controller, $actionMethod)) { break; }
00108 if (method_exists($controller, '__setController')) {
00109 $controller->__setController($controllerName, $actionName);
00110 }
00111 if (method_exists($controller, '__setDispatcher')) {
00112 $controller->__setDispatcher($this);
00113 }
00114
00115
00116 if (method_exists($controller, '_beforeExecute')) {
00117 $controller->_beforeExecute($actionMethod);
00118 }
00119
00120 $ret = $controller->{$actionMethod}();
00121
00122 if (method_exists($controller, '_afterExecute')) {
00123 $controller->_afterExecute($actionMethod);
00124 }
00125 return $ret;
00126 } while (false);
00127
00128 if ($callback) {
00129
00130 $args = array($controllerName, $actionName, $controllerClass);
00131 return call_user_func_array($callback, $args);
00132 }
00133
00134 if (is_null($controller)) {
00135 FLEA::loadClass('FLEA_Exception_MissingController');
00136 __THROW(new FLEA_Exception_MissingController(
00137 $controllerName, $actionName, $this->_requestBackup,
00138 $controllerClass, $actionMethod, $controllerClassFilename));
00139 return false;
00140 }
00141
00142 FLEA::loadClass('FLEA_Exception_MissingAction');
00143 __THROW(new FLEA_Exception_MissingAction(
00144 $controllerName, $actionName, $this->_requestBackup,
00145 $controllerClass, $actionMethod, $controllerClassFilename));
00146 return false;
00147 }
00148
00156 function getControllerName()
00157 {
00158 $controllerName = preg_replace('/[^a-z0-9_]+/i', '', $this->_request['controller']);
00159 if ($controllerName == '') {
00160 $controllerName = FLEA::getAppInf('defaultController');
00161 }
00162 if (FLEA::getAppInf('urlLowerChar')) {
00163 $controllerName = strtolower($controllerName);
00164 }
00165 return $controllerName;
00166 }
00167
00173 function setControllerName($controllerName)
00174 {
00175 $this->_request['controller'] = $controllerName;
00176 }
00177
00185 function getActionName()
00186 {
00187 $actionName = preg_replace('/[^a-z0-9]+/i', '', $this->_request['action']);
00188 if ($actionName == '') {
00189 $actionName = FLEA::getAppInf('defaultAction');
00190 }
00191 return $actionName;
00192 }
00193
00199 function setActionName($actionName)
00200 {
00201 $this->_request['action'] = $actionName;
00202 }
00203
00211 function getControllerClass($controllerName)
00212 {
00213 $controllerClass = FLEA::getAppInf('controllerClassPrefix');
00214 if (FLEA::getAppInf('urlLowerChar')) {
00215 $controllerClass .= ucfirst(strtolower($controllerName));
00216 } else {
00217 $controllerClass .= $controllerName;
00218 }
00219 return $controllerClass;
00220 }
00221
00229 function parseUrl($url)
00230 {
00231 $url = parse_url($url);
00232 $args = array();
00233 parse_str($url['query'], $args);
00234 $args = array_change_key_case($args, CASE_LOWER);
00235 $controllerAccessor = strtolower(FLEA::getAppInf('controllerAccessor'));
00236 $actionAccessor = strtolower(FLEA::getAppInf('actionAccessor'));
00237
00238 $controllerName = isset($args[$controllerAccessor]) ?
00239 $args[$controllerAccessor] : null;
00240 $actionName = isset($args[$actionAccessor]) ?
00241 $args[$actionAccessor] : null;
00242
00243 unset($args[$controllerAccessor]);
00244 unset($args[$actionAccessor]);
00245 return array($controllerName, $actionName, $args);
00246 }
00247
00255 function _loadController($controllerClass)
00256 {
00257 $controllerClassFilename = FLEA::getFilePath($controllerClass . '.php', true);
00258 if (!is_readable($controllerClassFilename)) {
00259 return false;
00260 }
00261 include_once($controllerClassFilename);
00262 return class_exists($controllerClass);
00263 }
00264 }