You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

原生PHP开发MVC框架如何实现URL解析控制器与方法的路由功能

原生PHP实现URL自动路由(控制器/方法自动调用)方案

前置准备:配置URL重写

所有请求必须先统一转发到项目入口文件(通常是根目录index.php),避免直接访问控制器目录文件,这是实现友好URL的基础:

  • Apache配置(根目录新建.htaccess文件):
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]
  • Nginx配置(站点配置段内添加):
location / {
    try_files $uri $uri/ /index.php?$query_string;
}

核心实现逻辑

1. 解析URL路径段

在入口文件index.php中获取请求路径,拆分出控制器名、方法名、参数三部分:

<?php
// 定义项目根目录常量,方便后续加载文件
define('ROOT_PATH', __DIR__ . '/');

// 获取pathinfo,处理没有pathinfo的默认情况
$pathInfo = $_SERVER['PATH_INFO'] ?? '/Home/index';
// 去除首尾斜杠,拆分路径段
$pathArr = array_filter(explode('/', trim($pathInfo, '/')));

// 提取控制器名,默认值为Home
$controllerName = ucfirst($pathArr[0] ?? 'Home');
// 提取方法名,默认值为index
$actionName = $pathArr[1] ?? 'index';
// 提取剩余路径作为方法参数
$params = array_slice($pathArr, 2) ?? [];

2. 加载并实例化控制器

做安全性校验,防止恶意路径穿越、非法调用:

// 拼接控制器文件路径,你的控制器放在Controller目录下
$controllerFile = ROOT_PATH . 'Controller/' . $controllerName . '.php';

// 校验控制器文件是否存在,不存在返回404
if (!file_exists($controllerFile)) {
    http_response_code(404);
    die("404 控制器不存在");
}
require_once $controllerFile;

// 校验类是否存在
if (!class_exists($controllerName)) {
    http_response_code(404);
    die("404 控制器类未定义");
}
$controllerInstance = new $controllerName();

3. 调用对应控制器方法

校验方法合法性,避免调用非公开方法、基础控制器内部方法:

// 校验方法是否存在且为public类型
if (!method_exists($controllerInstance, $actionName) || !is_callable([$controllerInstance, $actionName])) {
    http_response_code(404);
    die("404 方法不存在或无访问权限");
}

// 传入参数调用方法
call_user_func_array([$controllerInstance, $actionName], $params);

可选优化点

  • 可以增加路由映射表,支持自定义路由规则,不用严格按照/控制器/方法的路径结构
  • 增加请求方法校验,支持限定GET/POST等请求类型
  • 增加中间件支持,在控制器调用前后统一处理权限、日志等逻辑
  • 对控制器名和方法名做白名单校验,禁止访问基础控制器等内部类

内容的提问来源于stack exchange,提问作者ALI HAIDER

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 14:15:03