本文目录导读:

在 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等开源路由库 - 关注性能:使用路由缓存、正则优化
- 保持简单:不要过度设计,根据项目规模选择合适的调度方案
对于小型项目,可以手动实现简单的路由器;对于中大型项目,建议直接使用成熟的框架或路由库。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播