php实现RESTful路由
RESTful路由的基本概念
RESTful路由是一种基于HTTP协议的API设计风格,通过URL路径和HTTP方法(GET/POST/PUT/DELETE等)实现对资源的操作。PHP实现RESTful路由通常需要解析请求URI和方法,并映射到对应的控制器逻辑。
使用原生PHP实现
通过解析$_SERVER全局变量获取请求信息,手动实现路由分发逻辑:
$requestUri = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
$requestMethod = $_SERVER['REQUEST_METHOD'];
// 路由匹配规则示例
$routes = [
'GET /api/users' => 'UserController@index',
'POST /api/users' => 'UserController@store',
'GET /api/users/{id}' => 'UserController@show',
'PUT /api/users/{id}' => 'UserController@update',
'DELETE /api/users/{id}' => 'UserController@destroy'
];
// 遍历路由进行匹配
foreach ($routes as $route => $handler) {
list($method, $path) = explode(' ', $route);
$pattern = preg_replace('/\{(\w+)\}/', '(?P<$1>[^/]+)', $path);
$pattern = "@^" . str_replace('/', '\/', $pattern) . "$@D";
if ($requestMethod == $method && preg_match($pattern, $requestUri, $matches)) {
array_shift($matches);
call_user_func_array(explode('@', $handler), $matches);
exit;
}
}
// 未匹配路由的处理
http_response_code(404);
echo json_encode(['error' => 'Not Found']);
使用框架实现
主流PHP框架都内置RESTful路由支持:
Laravel示例:
// routes/api.php
Route::apiResource('users', 'UserController');
// 生成的标准路由:
// GET /api/users → index()
// POST /api/users → store()
// GET /api/users/{user} → show()
// PUT/PATCH /api/users/{user} → update()
// DELETE /api/users/{user} → destroy()
Slim Framework示例:
$app->group('/api', function (RouteCollectorProxy $group) {
$group->get('/users', 'UserController:index');
$group->post('/users', 'UserController:store');
$group->get('/users/{id}', 'UserController:show');
$group->put('/users/{id}', 'UserController:update');
$group->delete('/users/{id}', 'UserController:destroy');
});
关键实现要点
- URI设计:使用名词复数形式表示资源(如
/users),避免动词 - HTTP方法:GET(查询)、POST(创建)、PUT(全量更新)、PATCH(部分更新)、DELETE(删除)
- 状态码:正确返回200/201/204(成功)、400(参数错误)、404(资源不存在)等
- 版本控制:建议在URI中包含版本号(如
/api/v1/users)
中间件处理
RESTful API通常需要添加中间件处理:
- 内容协商(Content-Type: application/json)
- 认证(JWT/OAuth)
- 请求频率限制
- CORS跨域支持
// Laravel中间件示例
Route::prefix('api')->middleware(['auth:api', 'json.response'])->group(function () {
Route::apiResource('users', 'UserController');
});
自动化文档生成
配合Swagger/OpenAPI规范生成API文档:
/
* @OA\Get(
* path="/api/users",
* summary="获取用户列表",
* @OA\Response(response=200, description="成功返回")
* )
*/
public function index() { /* ... */ }






