`

让FLEAPHP支持简易的命名空间

阅读更多

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

 

 

 

分享到:
评论

相关推荐

    fleaphp核心完整代码

    Fleaphp的视图系统支持模板引擎,允许开发者使用模板语言编写动态视图,提高代码可读性和维护性。 5. **数据库操作**:Fleaphp提供了数据库抽象层,支持多种数据库如MySQL、SQLite、PostgreSQL等。它使用ORM(对象...

    fleaphp1.7.1524

    4. **数据库支持**:Fleaphp通常支持多种数据库,如MySQL、SQLite等,通过简单的API进行数据操作,如CRUD(创建、读取、更新、删除)操作,以及更复杂的查询构建。 5. **模板引擎**:框架内可能包含一个模板引擎,...

    fleaphp框架

    7. **缓存机制**:为了提高性能,FleaPHP支持多种缓存策略,如文件缓存、内存缓存(如APC),可以有效减少数据库访问。 8. **安全防护**:框架内置了一些安全措施,如防止SQL注入、XSS攻击,确保应用的安全性。 9....

    fleaphp中文手册详细版

    Fleaphp支持中间件,这是一种处理请求和响应的组件,可以用于实现如认证、日志记录、限速等功能。中间件可以按需堆叠,提供灵活的请求处理流程。 七、配置(Configuration) Fleaphp的配置文件允许开发者自定义框架的...

    php框架fleaphp

    作为一款优秀的框架,Fleaphp旨在提供高效、简洁且易于上手的开发工具,帮助开发者快速构建Web应用。下面将详细介绍Fleaphp的主要特点、核心组件以及如何使用它进行开发。 1. **主要特点** - **轻量级**:Fleaphp...

    fleaphp 框架实例以及详细使用方法说明

    Fleaphp支持中间件,这是一种强大的功能,可以在请求到达控制器之前或之后执行额外的处理。例如,你可以创建一个登录检查中间件,确保只有已登录用户才能访问特定的控制器方法。 7. **错误处理与日志记录** ...

    fleaphp手册

    fleaphp.chm手册

    fleaphp中文手册

    4. **数据库支持**:FleaPHP提供了数据库抽象层,支持多种数据库系统如MySQL、SQLite、PostgreSQL等,通过统一的API进行数据操作,降低了数据库迁移的难度。 5. **模板引擎**:内置模板引擎,支持动态变量、控制...

    fleaphp框架附实例(最新版)

    2. **路由系统**:Fleaphp的路由机制允许开发者灵活定义URL到控制器和方法的映射,支持参数传递,实现URL美化和更高效地处理HTTP请求。 3. **控制器(Controller)**:控制器是MVC模式中的关键组件,负责接收用户请求...

    FleaPHP+开发指南

    fleaphp框架,国产最好php开发框架

    FleaPHP chm文档

    FleaPHP chm文档,简单实例,框架流程介绍

    FleaPHP的单入口文件详解

    路由可以是预定义的,也可以动态生成,以支持RESTful API或其他高级路由策略。 5. **执行控制器**:找到对应的控制器后,FleaPHP会调用其方法来处理业务逻辑。控制器可以操作模型数据,进行业务处理,并调用视图来...

    Fleaphp 常用方法.doc

    在FleaPHP开源应用程序开发框架中,有几个关键的系统方法,它们是开发高效Web应用的基础。下面我们将详细探讨这些方法: 1. **FLEA::initWebControls()**: 这个函数用于初始化WebControls,它返回一个`FLEA_...

    FleaPHP 框架学习教程.zip

    最后,FleaPHP支持Composer包管理器,这意味着您可以轻松地引入第三方库来扩展框架的功能,比如添加验证码、邮件发送、支付接口等。 总的来说,FleaPHP框架为PHP开发者提供了一个轻便而功能齐全的工具集,适合快速...

    FleaPHP 框架学习教程.pdf

    - 命名规范和目录结构介绍。 - 应用程序设置详解。 - 数据库访问方法。 2. **MVC模式篇** - MVC模式基础理论。 - FleaPHP的MVC模式特色分析。 - 构建基本的MVC应用程序步骤。 3. **数据库操作篇** - ...

    FleaPHP 开发指南

    - 文章未提供具体细节,但通常FleaPHP会有明确的命名规范和目录结构以支持MVC架构。 - **可能包括**: - 控制器、模型、视图的命名规则。 - 目录结构如`controllers/`, `models/`, `views/`等。 #### 五、应用程序...

    php.mysql.FLEAPHP.Smarty.正则手册汇总

    `FLEAPHP手册1.chm`为开发者提供了框架的使用指南,包括路由设定、模型构建、视图渲染、控制器操作等,有助于快速理解和应用这个框架。 【Smarty】:Smarty是一个PHP模板引擎,将业务逻辑和显示模板分离,提高代码...

    Fleaphp框架使用规范收集.pdf

    - 数据访问层(Data Gateway):在MVC架构中,数据访问层封装了与数据库交互的所有细节,Fleaphp框架使用TableDataGateway类来实现这一点,支持CRUD(创建、读取、更新、删除)操作。 - 视图渲染:框架支持Smarty...

    fleaphp ajaxLogin.

    【fleaphp AJAX Login 实例详解】 在Web开发中,用户登录是常见的功能,而AJAX(Asynchronous JavaScript and XML)技术的应用使得用户交互更加流畅,无需刷新页面即可完成登录操作。本实例将深入探讨如何使用...

Global site tag (gtag.js) - Google Analytics