Simple.php

浏览该文件的文档。
00001 <?php
00003 // FleaPHP Framework
00004 //
00005 // Copyright (c) 2005 - 2007 FleaPHP.org (www.fleaphp.org)
00006 //
00007 // 许可协议,请查看源代码中附带的 LICENSE.txt 文件,
00008 // 或者访问 http://www.fleaphp.org/ 获得详细信息。
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             // 调用 _beforeExecute() 方法
00116             if (method_exists($controller, '_beforeExecute')) {
00117                 $controller->_beforeExecute($actionMethod);
00118             }
00119             // 执行 action 方法
00120             $ret = $controller->{$actionMethod}();
00121             // 调用 _afterExecute() 方法
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 }

Generated at Sat Feb 2 15:18:51 2008 for FleaPHP by  doxygen 1.5.3