📜  php 路由 - PHP (1)

📅  最后修改于: 2023-12-03 15:03:43.643000             🧑  作者: Mango

PHP 路由

简介

在 Web 开发中,路由(routing)是指根据 URL 的不同访问路径,将请求分配到不同的处理程序(或者称为控制器)进行处理的过程。在 PHP 中,通过编写路由代码,可以实现一个完整的 Web 应用。

常见的路由实现方式
1. 常规实现

在传统的 PHP 开发中,常常会将路由信息保存在数组中,然后通过解析 URL,并从数组中取出对应的处理程序来实现路由分发。示例代码如下:

// 定义路由规则
$routes = array(
    '/' => 'home.php',
    '/about' => 'about.php',
    '/contact' => 'contact.php',
);

// 解析 URL 并分配路由
$request_uri = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
$script_name = $_SERVER['SCRIPT_NAME'];
$base_path = rtrim(dirname($script_name), '\/');
$route = str_replace($base_path, '', $request_uri);
if (isset($routes[$route])) {
    require $routes[$route];
} else {
    // 找不到路由
    header('HTTP/1.1 404 Not Found');
    echo '404 Not Found';
}
2. 框架实现

许多 PHP 框架都提供了内置的路由功能,例如 Laravel、Symfony 等。这些框架通常使用正则表达式来匹配 URL,并将 URL 中的参数通过命名路由(named routes,也称为路由别名),传递给对应的控制器。示例代码如下:

Route::get('/users/{id}', 'UserController@show')->name('users.show');
3. RESTful API

在开发 RESTful API 时,通常使用不同的 HTTP 方法(GET、POST、PUT、DELETE 等)来实现不同的功能,并根据 URL 中的资源 ID 进行路由分发。示例代码如下:

$id = isset($_GET['id']) ? $_GET['id'] : null;
if ($_SERVER['REQUEST_METHOD'] === 'GET') {
    if ($id) {
        // 获取单个资源
        $result = get_resource($id);
    } else {
        // 获取所有资源
        $result = get_all_resources();
    }
    echo json_encode($result);
} elseif ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // 创建新的资源
    $data = json_decode(file_get_contents('php://input'), true);
    $result = create_resource($data);
    echo json_encode($result);
} elseif ($_SERVER['REQUEST_METHOD'] === 'PUT') {
    // 更新资源
    $data = json_decode(file_get_contents('php://input'), true);
    $result = update_resource($id, $data);
    echo json_encode($result);
} elseif ($_SERVER['REQUEST_METHOD'] === 'DELETE') {
    // 删除资源
    $result = delete_resource($id);
    echo json_encode($result);
} else {
    header('HTTP/1.1 405 Method Not Allowed');
    echo '405 Method Not Allowed';
}
总结

通过编写路由代码,可以实现自己的 Web 应用,同时也能够更深入地理解 Web 服务器和 PHP 语言。虽然路由实现方式有很多种,但无论是采用传统的数组方式还是使用框架的命名路由,都需要根据具体的应用场景来灵活选择。