PHP 怎么PHP 控制器调度

wen PHP项目 2

本文目录导读:

PHP 怎么PHP 控制器调度

  1. 基础手动调度(适合小型应用)
  2. 动态路由调度(推荐)
  3. 控制器基类
  4. 使用 Composer 包(推荐)
  5. 完整的 Nginx + PHP-FPM 配置
  6. 高级特性实现
  7. 最佳实践建议

在 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;
        // 存储处理逻辑
    }
}

最佳实践建议

  1. 选择成熟的框架:对于生产环境,建议使用 Laravel、Symfony、ThinkPHP 等成熟框架
  2. 使用 Composer:使用 nikic/fast-routebramus/router 等开源路由库
  3. 关注性能:使用路由缓存、正则优化
  4. 保持简单:不要过度设计,根据项目规模选择合适的调度方案

对于小型项目,可以手动实现简单的路由器;对于中大型项目,建议直接使用成熟的框架或路由库。

抱歉,评论功能暂时关闭!