php实现单一入口
PHP 实现单一入口的方法
单一入口(Single Entry Point)是一种设计模式,所有请求都通过一个入口文件(如 index.php)处理,再由该文件根据路由分发到不同的控制器或模块。以下是实现方法:
配置服务器重定向
确保所有请求都指向入口文件。以 Apache 为例,在 .htaccess 文件中添加以下规则:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?url=$1 [L,QSA]
Nginx 的配置类似:

location / {
try_files $uri $uri/ /index.php?$query_string;
}
创建入口文件 index.php
在入口文件中初始化应用,解析请求并路由到对应的控制器或模块:
<?php
// 定义常量(如根路径)
define('BASE_PATH', __DIR__);
// 加载自动加载文件(如 Composer)
require_once BASE_PATH . '/vendor/autoload.php';
// 解析 URL 或路由参数
$request = $_SERVER['REQUEST_URI'] ?? '/';
$request = str_replace('/public/', '', $request);
// 路由分发逻辑(示例:简单路由)
switch ($request) {
case '/':
require_once BASE_PATH . '/controllers/HomeController.php';
break;
case '/about':
require_once BASE_PATH . '/controllers/AboutController.php';
break;
default:
http_response_code(404);
echo '404 Not Found';
break;
}
使用路由组件(推荐)
对于复杂项目,建议使用现成的路由库(如 Symfony Routing 或 FastRoute):

use FastRoute\Dispatcher;
use FastRoute\RouteCollector;
$dispatcher = FastRoute\simpleDispatcher(function(RouteCollector $r) {
$r->addRoute('GET', '/', 'HomeController@index');
$r->addRoute('GET', '/about', 'AboutController@index');
});
$httpMethod = $_SERVER['REQUEST_METHOD'];
$uri = $_SERVER['REQUEST_URI'];
$routeInfo = $dispatcher->dispatch($httpMethod, $uri);
switch ($routeInfo[0]) {
case Dispatcher::NOT_FOUND:
http_response_code(404);
break;
case Dispatcher::METHOD_NOT_ALLOWED:
http_response_code(405);
break;
case Dispatcher::FOUND:
$handler = $routeInfo[1];
$vars = $routeInfo[2];
call_user_func($handler, $vars);
break;
}
自动加载类
通过 Composer 或自定义自动加载器加载类文件:
// composer.json 配置
{
"autoload": {
"psr-4": {
"App\\": "src/"
}
}
}
运行 composer dump-autoload 生成自动加载文件。
分离业务逻辑
将路由逻辑与业务逻辑分离,例如:
- 入口文件仅处理请求初始化。
- 路由配置单独存放在
routes.php。 - 控制器存放在
src/Controllers目录。
示例目录结构
project/
├── public/
│ └── index.php # 单一入口文件
├── src/
│ ├── Controllers/ # 控制器
│ └── Models/ # 模型
├── vendor/ # Composer 依赖
├── routes.php # 路由配置
└── .htaccess # URL 重写规则
通过以上步骤,可以实现一个清晰、可维护的单一入口应用。






