浏览 1736 次
锁定老帖子 主题:让FLEAPHP支持简易的命名空间
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-11-10
在FLEA/Filter/ 目录下增加一个文件,叫做NamespaceURI.php,里面内容如下: <?php /** * 增加命名空间支持 -- 将命名空间挂接到控制器名称之前 */ function ___namespace_urlrewrite_filter() { static $firstTime = true; if (!$firstTime) { return; } $firstTime = false; $namespaceAccessor = FLEA::getAppInf('namespaceAccessor','namespace') ; $controllerAccessor = FLEA::getAppInf('controllerAccessor') ; $actionAccessor = FLEA::getAppInf('actionAccessor') ; $defaultNamespace = strtolower(FLEA::getAppInf('defaultNamespace','default')) ; $_ = FLEA::getAppInf('namespaces',array('default' =>'') ) ; foreach ($_ as $k=>$v) { $namespaces[trim(strtolower($k))] = trim($v) ; } $pathinfo = !empty($_SERVER['PATH_INFO']) ? $_SERVER['PATH_INFO'] : (!empty($_SERVER['ORIG_PATH_INFO']) ? $_SERVER['ORIG_PATH_INFO'] : ''); $parts = explode('/', substr($pathinfo, 1)); // 初始化变量 $namespace = $defaultNamespace ; $controllerName = $actionName = null ; // 如果是重写的url,pathinfo 则有值,标准URI的话,pathinfo取不到值 if (isset($parts[0]) && strlen($parts[0])) { // 查找命名空间和命名空间对应的控制器前缀部分 $test = trim(strtolower($parts[0])) ; foreach ($namespaces as $namespaceName=>$namespaceValue){ if ($test == $namespaceName){ $namespace = $namespaceName ; break ; } } if ($namespace == $defaultNamespace){ $controllerName = trim($parts[0]) ; if (isset($parts[1]) && strlen($parts[1])) $actionName = trim($parts[1]) ; $start = 2 ; }else { if (isset($parts[1]) && strlen($parts[1])) $controllerName = trim($parts[1]) ; if (isset($parts[2]) && strlen($parts[2])) $actionName = trim($parts[2]) ; $start = 3 ; } $style = FLEA::getAppInf('urlParameterPairStyle'); if ($style == '/') { for ($i = $start; $i < count($parts); $i += 2) { if (isset($parts[$i + 1])) { $_GET[$parts[$i]] = $parts[$i + 1]; } } } else { for ($i = $start; $i < count($parts); $i++) { $p = $parts[$i]; $arr = explode($style, $p); if (isset($arr[1])) { $_GET[$arr[0]] = $arr[1]; } } } } // 设置最后的命名空间/控制器/Action的值 if (isset($_GET[$namespaceAccessor]) && strlen($_GET[$namespaceAccessor])){ $ns = trim(strtolower($_GET[$namespaceAccessor])) ; if ( isset($namespaces[$ns]) ) $namespace = $ns ; } $_GET[$namespaceAccessor] = $namespace ; if (isset($_GET[$controllerAccessor]) && strlen($_GET[$controllerAccessor])){ $controllerName = $_GET[$controllerAccessor] ; } $controllerName = $controllerName ? $controllerName : FLEA::getAppInf('defaultController') ; $prefix = strlen($namespaces[$namespace]) ? "{$namespaces[$namespace]}_" : '' ; $_GET[$controllerAccessor] = $prefix . ucwords($controllerName) ; if (isset($_GET[$actionAccessor]) && strlen($_GET[$actionAccessor])){ $actionName = $_GET[$actionAccessor] ; } $_GET[$actionAccessor] = $actionName ? $actionName : FLEA::getAppInf('defaultAction') ; FLEA::setAppInf('namespaceAccessor',$namespaceAccessor) ; FLEA::setAppInf('defaultNamespace',$defaultNamespace) ; FLEA::setAppInf('namespaces',$namespaces) ; FLEA::setAppInf($namespaceAccessor,$namespace) ; // 将 $_GET 合并到 $_REQUEST, // 有时需要使用 $_REQUEST 统一处理 url 中的 id=? 这样的参数 $_REQUEST = array_merge($_REQUEST, $_GET); } /** * 增加命名空间支持 -- 将命名空间挂接到控制器名称之前 */ function ___namespace_urlstandard_filter() { static $firstTime = true; if (!$firstTime) { return; } $firstTime = false; $namespaceAccessor = FLEA::getAppInf('namespaceAccessor','namespace') ; $controllerAccessor = FLEA::getAppInf('controllerAccessor') ; $actionAccessor = FLEA::getAppInf('actionAccessor') ; $defaultNamespace = strtolower(FLEA::getAppInf('defaultNamespace','default')) ; $_ = FLEA::getAppInf('namespaces',array('default' =>'') ) ; foreach ($_ as $k=>$v) { $namespaces[trim(strtolower($k))] = trim($v) ; } // 初始化变量 $namespace = $defaultNamespace ; $controllerName = $actionName = null ; // 设置最后的命名空间/控制器/Action的值 if (isset($_GET[$namespaceAccessor]) && strlen($_GET[$namespaceAccessor])){ $ns = trim(strtolower($_GET[$namespaceAccessor])) ; if ( isset($namespaces[$ns]) ) $namespace = $ns ; } $_GET[$namespaceAccessor] = $namespace ; if (isset($_GET[$controllerAccessor]) && strlen($_GET[$controllerAccessor])){ $controllerName = $_GET[$controllerAccessor] ; } $controllerName = $controllerName ? $controllerName : FLEA::getAppInf('defaultController') ; $prefix = strlen($namespaces[$namespace]) ? "{$namespaces[$namespace]}_" : '' ; $_GET[$controllerAccessor] = $prefix . ucwords($controllerName) ; if (isset($_GET[$actionAccessor]) && strlen($_GET[$actionAccessor])){ $actionName = $_GET[$actionAccessor] ; } $_GET[$actionAccessor] = $actionName ? $actionName : FLEA::getAppInf('defaultAction') ; FLEA::setAppInf('namespaceAccessor',$namespaceAccessor) ; FLEA::setAppInf('defaultNamespace',$defaultNamespace) ; FLEA::setAppInf('namespaces',$namespaces) ; FLEA::setAppInf($namespaceAccessor,$namespace) ; // 将 $_GET 合并到 $_REQUEST, // 有时需要使用 $_REQUEST 统一处理 url 中的 id=? 这样的参数 $_REQUEST = array_merge($_REQUEST, $_GET); } /** * 增加命名空间支持 -- 将控制器名称转化成 命名空间/控制器名称 * * @return string */ function ___namespaceToURI($controllerName=null,$isUrlRewrite=true) { if (!$controllerName) return '' ; $controllerName = trim(strtolower($controllerName)) ; $defaultNamespace = FLEA::getAppInf('defaultNamespace') ; $namespace = $defaultNamespace ; $namespaces = FLEA::getAppInf('namespaces') ; foreach ($namespaces as $key=>$val){ if (!empty($val)){ $val = strtolower($val) . '_'; if (preg_match("/^{$val}*/i",$controllerName)){ $namespace = $key ; $controllerName = preg_replace("/^{$val}*/i",'',$controllerName); break ; } } } if ($isUrlRewrite){ return $namespace == $defaultNamespace ? '/' . rawurlencode($controllerName) : sprintf('/%s/%s',rawurlencode($namespace),rawurlencode($controllerName)) ; }else { return $namespace == $defaultNamespace ? FLEA::getAppInf('controllerAccessor') . '=' . rawurlencode($controllerName) : sprintf("%s=%s&%s=%s", FLEA::getAppInf('namespaceAccessor'),rawurlencode($namespace) , FLEA::getAppInf('controllerAccessor'),rawurlencode($controllerName)) ; } } if (FLEA::getAppInf('urlMode') != URL_STANDARD) { ___namespace_urlrewrite_filter() ; }else { ___namespace_urlstandard_filter(); }
修改 FLEA.php 文件中的几行:
找到: 并注释掉 // 根据 URL 模式设置,决定是否要载入 URL 分析过滤器 // if (FLEA::getAppInf('urlMode') != URL_STANDARD) { // require(FLEA_DIR . '/Filter/Uri.php'); // } 增加一行: require(FLEA_DIR . '/Filter/NamespaceURI.php');
修改url方法里面的代码:
找到 : // PATHINFO 和 REWRITE 模式 注释处,在下面继续找到 $url .= '/' . rawurlencode($controllerName);
将其注释掉,加上一行 $url .= ___namespaceToURI($controllerName,true);
找到 : // 标准模式 注释处,在下面继续找到:
if ($controllerName != $defaultController && !is_null($controllerName)) { // $url .= $parajoin . rawurlencode($controllerName); @注释掉这里的代码
// 修改为: $url .= $parajoin . ___namespaceToURI($controllerName,false);
}
此时全部修改完成,在 项目的配置文件中加入:
'namespaces' => array( 'blog' => 'Blog' , 'default' => '' , ) ,
从浏览器访问: /blog/news/list/page/3/cat/internet
则会 自动定位到 url('Blog_News','list',array('page'=>3,'cat'=>'internet'))
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |