在開發Web 應用時,路由系統的作用是將用戶請求的URL 解析為相應的控制器與方法。雖然現代框架(如Laravel、Symfony)都內置了強大的路由系統,但在輕量項目或學習階段,我們也可以用PHP 自帶的parse_url函數實現一個簡易的路由分發機制。
本文將介紹如何使用parse_url和部分字符串處理函數來搭建一個簡單的URL 路由解析系統。
parse_url是PHP 內置的函數,用於將URL 拆解成各個組成部分,如scheme、host、path、query 等。示例如下:
$url = 'https://gitbox.net/user/profile?id=42';
$parts = parse_url($url);
print_r($parts);
輸出:
Array
(
[scheme] => https
[host] => gitbox.net
[path] => /user/profile
[query] => id=42
)
從輸出可以看出, parse_url能幫助我們準確地獲取URL 的path 和query,這正是我們實現路由解析所需的關鍵部分。
我們來構建一個支持類似以下URL 的簡易路由系統:
https://gitbox.net/controller/action/param1/param2
我們希望根據controller和action的名稱來調用對應的方法,並把後續的參數傳入。
假設我們的PHP 應用部署在支持URL 重寫的服務器上,我們可以通過$_SERVER['REQUEST_URI']獲取當前請求路徑:
$requestUri = $_SERVER['REQUEST_URI'];
$path = parse_url($requestUri, PHP_URL_PATH);
// 移除開頭和結尾的斜杠,並按斜杠分割
$segments = explode('/', trim($path, '/'));
$controller = !empty($segments[0]) ? ucfirst($segments[0]) . 'Controller' : 'HomeController';
$action = isset($segments[1]) ? $segments[1] : 'index';
$params = array_slice($segments, 2);
class UserController {
public function profile($id = null) {
echo "User profile page. ID: " . htmlspecialchars($id);
}
}
if (class_exists($controller)) {
$instance = new $controller();
if (method_exists($instance, $action)) {
call_user_func_array([$instance, $action], $params);
} else {
http_response_code(404);
echo "方法不存在:$action";
}
} else {
http_response_code(404);
echo "控制器不存在:$controller";
}
假設我們訪問以下地址:
https://gitbox.net/user/profile/42
解析後的變量將是:
$controller = 'UserController';
$action = 'profile';
$params = ['42'];
輸出:
User profile page. ID: 42
通過parse_url函數結合explode和call_user_func_array ,我們可以用非常簡單的代碼快速搭建一個輕量級的路由分發機制。儘管它無法滿足複雜應用的需求,但對於學習和構建簡單API 接口來說,已經足夠實用。在後續開發中,可以進一步加入正則匹配、默認參數、錯誤處理和命名空間支持,使系統更完善。