在PHP中,利用单一入口文件实现路径的访问,实现形如 http://localhost/project/index.php/module/method/param_key/param_val 的访问路由
module:模块名称(类)
method:模块方法
param_key:参数名称
param_val:参数值
一、新建项目 route
在 route 下新 index.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("定义的模块不存在");
}
?>
二、在项目目录下新建 controller 文件夹,并在该文件夹下新建 Welcome.class.php 文件,代码如下
class Welcome{
public function index($param){
echo 'Hello World!';
}
}
?>
三、地址栏输入 http://localhost/route/index.php/welcome/index/
页面输出 “ Hello World! ”