本文目录导读:

在 PHP 中实现控制器调度(Router Dispatch),通常是指根据 HTTP 请求的 URL 和方法,将请求分发到对应的控制器方法进行处理,以下是几种常见的实现方式,从简单到框架级:
基础手动调度(适合小型应用)
<?php
// index.php - 入口文件
$requestUri = $_SERVER['REQUEST_URI'];
$method = $_SERVER['REQUEST_METHOD'];
// 解析路由
$path = parse_url($requestUri, PHP_URL_PATH);
$path = trim($path, '/');
// 简单路由映射
switch ($path) {
case 'user/list':
$controller = new UserController();
$controller->list();
break;
case 'user/create':
if ($method === 'POST') {
$controller = new UserController();
$controller->create();
}
break;
default:
http_response_code(404);
echo "404 Not Found";
}
动态路由调度(推荐)
<?php
// router.php
class Router {
private $routes = [];
// 定义路由
public function get($path, $handler) {
$this->routes['GET'][$path] = $handler;
}
public function post($path, $handler) {
$this->routes['POST'][$path] = $handler;
}
// 调度方法
public function dispatch() {
$method = $_SERVER['REQUEST_METHOD'];
$path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
$path = trim($path, '/');
// 匹配路由
foreach ($this->routes[$method] ?? [] as $route => $handler) {
$pattern = $this->convertToPattern($route);
if (preg_match($pattern, $path, $matches)) {
// 提取参数
array_shift($matches);
// 执行控制器方法
list($controller, $action) = explode('@', $handler);
$controller = new $controller();
return call_user_func_array([$controller, $action], $matches);
}
}
http_response_code(404);
echo "Route not found";
}
// 将路由转换为正则
private function convertToPattern($route) {
$pattern = preg_replace('/\{([a-z]+)\}/', '(?P<$1>[^/]+)', $route);
return '/^' . str_replace('/', '\/', $pattern) . '$/';
}
}
// 使用示例
$router = new Router();
$router->get('user/{id}', 'UserController@show');
$router->get('user/list', 'UserController@list');
$router->post('user/create', 'UserController@create');
$router->dispatch();
控制器基类
<?php
// BaseController.php
abstract class BaseController {
protected $request;
public function __construct() {
$this->request = $_REQUEST;
}
protected function json($data, $statusCode = 200) {
http_response_code($statusCode);
header('Content-Type: application/json');
echo json_encode($data);
exit;
}
protected function view($view, $data = []) {
extract($data);
require "views/{$view}.php";
}
}
// UserController.php
class UserController extends BaseController {
public function show($id) {
$user = ['id' => $id, 'name' => 'John Doe'];
$this->json($user);
}
public function list() {
$users = [
['id' => 1, 'name' => 'Alice'],
['id' => 2, 'name' => 'Bob']
];
$this->json($users);
}
}
使用 Composer 包(推荐)
slim 框架路由示例
<?php
use Slim\Factory\AppFactory;
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
require __DIR__ . '/../vendor/autoload.php';
$app = AppFactory::create();
// 定义路由
$app->get('/user/{id}', function (Request $request, Response $response, $args) {
$id = $args['id'];
// 处理逻辑
$response->getBody()->write("User ID: $id");
return $response;
});
$app->post('/user/create', 'UserController:create');
$app->run();
完整的 Nginx + PHP-FPM 配置
# nginx.conf
server {
listen 80;
server_name example.com;
root /var/www/public;
index index.php;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
高级特性实现
<?php
// 中间件支持
class MiddlewareRouter extends Router {
private $middlewares = [];
public function addMiddleware($middleware) {
$this->middlewares[] = $middleware;
}
public function dispatch() {
// 执行中间件
foreach ($this->middlewares as $middleware) {
$middleware->handle();
}
parent::dispatch();
}
}
// 路由分组
class GroupRouter {
private $prefix;
private $routes = [];
public function __construct($prefix) {
$this->prefix = $prefix;
}
public function add($path, $handler) {
$this->routes[] = $this->prefix . $path;
// 存储处理逻辑
}
}
最佳实践建议
- 选择成熟的框架:对于生产环境,建议使用 Laravel、Symfony、ThinkPHP 等成熟框架
- 使用 Composer:使用
nikic/fast-route或bramus/router等开源路由库 - 关注性能:使用路由缓存、正则优化
- 保持简单:不要过度设计,根据项目规模选择合适的调度方案
对于小型项目,可以手动实现简单的路由器;对于中大型项目,建议直接使用成熟的框架或路由库。