路由是 MVC 框架的入口守門人,將 URL 映射為具體的控制器類與方法。單入口模式下,所有請求經 index.php 進入,框架內部解析 $_SERVER 變量完成分發。
$root = $_SERVER['SCRIPT_NAME']; // /MVC/index.php
$request = $_SERVER['REQUEST_URI']; // /MVC/index.php/class/method/arg1
$url = trim(str_replace($root, '', $request), '/'); // class/method/arg1
| URL 結構 | 控制器 | 方法 | 參數 |
|---|---|---|---|
| / | Index | welcome | [] |
| /user | User | index | [] |
| /user/profile | User | profile | [] |
| /article/show/123 | Article | show | [123] |
<?php
define('APPPATH', __DIR__);
$root = $_SERVER['SCRIPT_NAME'];
$request = $_SERVER['REQUEST_URI'];
$url = trim(str_replace($root, '', $request), '/');
if (empty($url)) {
$class = 'Index'; $func = 'welcome';
} else {
$uri = explode('/', $url);
$class = ucfirst($uri[0]);
$func = $uri[1] ?? 'index';
$args = array_slice($uri, 2);
}
include APPPATH . "/application/controllers/{$class}.php";
$obj = new $class();
call_user_func_array([$obj, $func], $args);
call_user_func_array(callable, array):動態調用方法並展開參數陣列。array_slice($uri, 2):提取第 3 段起作為方法參數。class_exists/method_exists),防止任意文件包含。路由看似簡單,實則是框架靈活性的基石。從手動分發到功能完整的路由組件(如 Symfony Router、FastRoute),核心思想始終是:URL → 控制器/動作 + 參數 的確定性映射。