PHP编写一个简单的路由类
本文介绍如何使用纯PHP编写一个基础的路由解析类,通过解析服务器环境变量提取控制器、操作方法及额外参数,适用于简单的MVC架构路径处理。
结果与目标
该代码的主要目标是替代简单的$_GET参数传递,使URL更加整洁(伪静态)。它将从URL中提取三部分信息:
- Controller:控制器名称
- Operate:具体的操作方法
- params:额外的路径参数数组
准备条件
确保服务器环境支持PATH_INFO变量。这通常需要在服务器配置(如Nginx的重写规则或Apache的AllowPathInfoOnTrailingSlash)中开启对路径信息的识别。默认情况下,如果未提供路径后缀,脚本会自动尝试从SCRIPT_NAME剥离前缀进行兼容处理。
真实操作顺序
第1步:定义Router类结构
创建一个名为Router的类,核心方法为getRouter。该方法接受一个$types参数来决定URL的分隔符类型:
1:使用斜杠/分隔(例如:site.com/controller/action)2:使用横杠-分隔(例如:site.com/controller-action)3:仅返回默认的Controller参数(用于特定简略路由场景)
<?php
class Router
{
public function getRouter($types = 1)
{
// 获取原始路径信息
if ( isset($_SERVER['PATH_INFO']) )
{
// 移除常见的静态文件后缀以防止误判
$query_string = substr(str_replace(array('.html','.htm', '.asp', '//'), '',$_SERVER['PATH_INFO']),1);
}
else
{
// 降级方案:处理没有PATH_INFO的情况
$query_string = str_replace($_SERVER['SCRIPT_NAME'], '',$_SERVER['PHP_SELF']);
}
// 根据类型选择分割方式
if ( $types == 1 )
{
$temp = explode('/', $query_string);
}
elseif ($types == 2)
{
$temp = explode('-', $query_string);
}
elseif ($types == 3)
{
return array('Controller'=>$_GET['controller']);
}
// 默认值处理
if ( empty($temp[0]) )
{
return array('Controller' => 'index','Operate' => 'index');
}
if ( empty($temp[1]) )
{
$temp[] = 'index';
}
// 清理空字符串项
foreach ($temp as $val)
{
if ($val)
{
$url[] = $val;
}
}
list($controller, $operate) = $url;
// 提取剩余参数
$params = array();
if ( count($url)>2 )
{
array_shift($url);
array_shift($url);
$params = $url;
}
return array(
"Controller" => $controller,
"Operate" => $operate,
"params" => $params,
);
}
}
?>
第2步:实例化并调用路由类
在入口文件(如index.php)中实例化该类,并根据实际需求传入类型参数。调用后即可通过返回数组获取路由结构。
<?php
$url = new Router();
// 使用第一种模式:/ 分隔
$result = $url->getRouter(1);
print_r($result);
?>
完成判断
执行上述代码后,若访问类似于 example.com/user/list/all 的地址,控制台输出的数组应包含以下关键数据(以类型1为例):
- Controller: user
- Operate: list
- params: array('all')
若访问地址仅为根目录或格式不符,代码会默认回退到 index 作为控制器和方法。
简要总结
以上就是基于PATH_INFO的PHP简单路由解析类的详细内容。这种轻量级的处理方式适合小型项目快速构建MVC结构的底层分发逻辑。更多关于PHP框架设计原理的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









