php 实现单一入口
单一入口实现方法
PHP实现单一入口的核心思想是通过一个主文件(如index.php)处理所有请求,再根据路由规则分发到不同的控制器或处理逻辑。以下是具体实现步骤:
基本结构设计
创建项目目录结构,通常包含以下核心文件:
- index.php(入口文件)
- .htaccess(Apache重写规则)
- app/(应用逻辑目录)
- controllers/(控制器目录)
- views/(视图目录)
- models/(模型目录)
入口文件处理
在index.php中处理所有请求:
<?php
// 定义应用路径常量
define('APP_PATH', dirname(__FILE__));
// 加载配置文件
require_once APP_PATH . '/config/config.php';
// 获取请求路径
$request = isset($_SERVER['PATH_INFO']) ? $_SERVER['PATH_INFO'] : '/';
// 路由解析
$router = new Router();
$router->dispatch($request);
URL重写配置
在.htaccess中配置URL重写规则(Apache环境):
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]
路由类实现
创建Router类处理路由分发:
class Router {
public function dispatch($uri) {
// 去除首尾斜杠
$uri = trim($uri, '/');
// 默认路由
if (empty($uri)) {
$controller = 'Home';
$action = 'index';
} else {
$parts = explode('/', $uri);
$controller = ucfirst($parts[0] ?? 'Home');
$action = $parts[1] ?? 'index';
}
// 构建控制器类名
$controllerClass = $controller . 'Controller';
$controllerFile = APP_PATH . '/app/controllers/' . $controllerClass . '.php';
// 检查控制器是否存在
if (!file_exists($controllerFile)) {
header("HTTP/1.0 404 Not Found");
exit('Controller not found');
}
// 实例化控制器
require_once $controllerFile;
$controllerInstance = new $controllerClass();
// 检查方法是否存在
if (!method_exists($controllerInstance, $action)) {
header("HTTP/1.0 404 Not Found");
exit('Action not found');
}
// 调用方法
$controllerInstance->$action();
}
}
控制器示例
创建示例控制器:
class HomeController {
public function index() {
echo "Welcome to homepage";
}
public function about() {
echo "About us page";
}
}
高级路由改进
对于更复杂的应用,可以考虑:
- 添加路由配置文件(routes.php)定义自定义路由
- 支持RESTful风格路由
- 添加中间件支持
- 实现参数解析(如/user/123)
改进后的路由配置示例:

// routes.php
return [
'/' => ['HomeController', 'index'],
'/about' => ['HomeController', 'about'],
'/user/{id}' => ['UserController', 'show']
];
注意事项
- 确保服务器支持URL重写(Apache需开启mod_rewrite)
- Nginx配置需要相应的rewrite规则
- 生产环境应考虑路由缓存提高性能
- 注意安全过滤,防止目录遍历攻击
- 对于大型项目建议使用现有框架(如Laravel/Symfony)的路由系统






