php路由实现
路由的基本概念
路由(Routing)在PHP中指的是将HTTP请求映射到特定的处理逻辑或控制器方法的过程。现代PHP框架(如Laravel、Symfony)通常内置路由功能,但也可以手动实现。
原生PHP实现路由
通过解析URL和请求方法,手动分发请求到对应的处理逻辑。
// 获取当前请求的URI和请求方法
$requestUri = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
$requestMethod = $_SERVER['REQUEST_METHOD'];
// 定义路由表
$routes = [
'GET' => [
'/' => 'homeController',
'/about' => 'aboutController'
],
'POST' => [
'/submit' => 'submitController'
]
];
// 路由匹配
if (isset($routes[$requestMethod][$requestUri])) {
call_user_func($routes[$requestMethod][$requestUri]);
} else {
header("HTTP/1.0 404 Not Found");
echo '404 Not Found';
}
使用FastRoute库
FastRoute是一个轻量级的路由库,适合在非框架项目中使用。
require 'vendor/autoload.php';
$dispatcher = FastRoute\simpleDispatcher(function(FastRoute\RouteCollector $r) {
$r->addRoute('GET', '/', 'homeController');
$r->addRoute('GET', '/about', 'aboutController');
$r->addRoute('POST', '/submit', 'submitController');
});
$httpMethod = $_SERVER['REQUEST_METHOD'];
$uri = $_SERVER['REQUEST_URI'];
$routeInfo = $dispatcher->dispatch($httpMethod, $uri);
switch ($routeInfo[0]) {
case FastRoute\Dispatcher::NOT_FOUND:
header("HTTP/1.0 404 Not Found");
break;
case FastRoute\Dispatcher::METHOD_NOT_ALLOWED:
header("HTTP/1.0 405 Method Not Allowed");
break;
case FastRoute\Dispatcher::FOUND:
$handler = $routeInfo[1];
$vars = $routeInfo[2];
call_user_func($handler, $vars);
break;
}
Laravel框架的路由示例
Laravel提供了简洁的路由定义方式,支持多种HTTP方法、路由参数和中间件。

// web.php
Route::get('/', function () {
return view('welcome');
});
Route::get('/about', 'AboutController@index');
Route::post('/submit', 'SubmitController@store');
// 带参数的路由
Route::get('/user/{id}', function ($id) {
return 'User '.$id;
});
// 路由分组和中间件
Route::middleware(['auth'])->group(function () {
Route::get('/profile', 'ProfileController@index');
Route::get('/settings', 'SettingsController@index');
});
Symfony框架的路由示例
Symfony使用注解或YAML/XML文件定义路由。
// src/Controller/DefaultController.php
use Symfony\Component\Routing\Annotation\Route;
class DefaultController
{
/
* @Route("/", name="home")
*/
public function index()
{
// ...
}
/
* @Route("/about", name="about")
*/
public function about()
{
// ...
}
}
路由缓存优化
对于生产环境,路由缓存可以提升性能。Laravel和Symfony都支持路由缓存。

# Laravel路由缓存
php artisan route:cache
# Symfony路由缓存
php bin/console cache:clear
动态路由参数处理
动态路由参数可以通过正则表达式约束或类型提示。
// Laravel带约束的路由
Route::get('/user/{id}', function ($id) {
//
})->where('id', '[0-9]+');
// Symfony类型提示路由
/
* @Route("/user/{id<\d+>}", name="user_show")
*/
public function show(int $id)
{
// ...
}
RESTful资源路由
Laravel的资源路由可以快速生成CRUD路由。
Route::resource('posts', 'PostController');
这将自动生成以下路由:
- GET /posts -> index
- GET /posts/create -> create
- POST /posts -> store
- GET /posts/{post} -> show
- GET /posts/{post}/edit -> edit
- PUT/PATCH /posts/{post} -> update
- DELETE /posts/{post} -> destroy






