在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'))