php 简单路由实现

在PHP中,利用单一入口文件实现路径的访问,实现形如 http://localhost/project/index.php/module/method/param_key/param_val 的访问路由php

module:模块名称(类)url

method:模块方法code

param_key:参数名称路由

param_val:参数值hash

1、新建项目 routeio

在 route 下新 index.php,代码以下function

<?php 
	error_reporting(0);  
	define(DIR_CONTROLLER, 'controller/'); // 定义控制器目录
	date_default_timezone_set("Asia/Shanghai");  
	$_DocumentPath = $_SERVER['DOCUMENT_ROOT'];  
	$_RequestUri = $_SERVER['REQUEST_URI'];  
	$_UrlPath = $_RequestUri;  
	$_FilePath = __FILE__;  
	$_AppPath = str_replace($_DocumentPath, '', $_FilePath);    //==>\route\index.php  
	$_AppPathArr = explode(DIRECTORY_SEPARATOR, $_AppPath);  
	for ($i = 0; $i < count($_AppPathArr); $i++) {  
		$p = $_AppPathArr[$i];  
		if ($p) {  
           $_UrlPath = preg_replace('/^\/'.$p.'\//', '/', $_UrlPath, 1);  
		}  
    }  

    $_UrlPath = preg_replace('/^\//', '', $_UrlPath, 1);  
    $_AppPathArr = explode("/", $_UrlPath);  
    $_AppPathArr_Count = count($_AppPathArr);   
    $arr_url = array(  
        'controller' => 'Index',  
        'method' => 'index',  
        'parms' => array()  
    );  

    $arr_url['controller'] = ucfirst($_AppPathArr[0]);  // 模块名称,首字母转为大写
    $arr_url['method'] = $_AppPathArr[1];  
    // 获取参数
    if ($_AppPathArr_Count > 2 and $_AppPathArr_Count % 2 != 0) {  
        //die('参数错误');  
    } else {  
        for ($i = 2; $i < $_AppPathArr_Count; $i+=2) {  
            $arr_temp_hash = array(strtolower($_AppPathArr[$i])=>$_AppPathArr[$i + 1]);  
            $arr_url['parms'] = array_merge($arr_url['parms'], $arr_temp_hash);  
        }  
    }   

    $module_name = $arr_url['controller'];  
    $module_file = DIR_CONTROLLER.$module_name.'.class.php';  
    $method_name = $arr_url['method'];  
    if (file_exists($module_file)) {  
        include $module_file;  

        $obj_module = new $module_name();  

        if (!method_exists($obj_module, $method_name)) {  
            die("要调用的方法不存在");  
        } else {  
            if (is_callable(array($obj_module, $method_name))) {  
                $obj_module -> $method_name($arr_url['parms']);   
            }  
        }        
    } else {  
        die("定义的模块不存在");  
    }  
?>

2、在项目目录下新建 controller 文件夹,并在该文件夹下新建 Welcome.class.php 文件,代码以下class

<?php 
	class Welcome{
		public function index($param){
			echo 'Hello World!';
		}
	}
?>

3、地址栏输入 http://localhost/route/index.php/welcome/index/module

页面输出 “ Hello World! ”date

相关文章
相关标签/搜索