论坛首页 编程语言技术论坛

让FLEAPHP支持简易的命名空间

浏览 1736 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-11-10  
PHP

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

 

 

 

论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics