webman 实现 restful 需严格遵循 route::resource() 映射规则,控制器方法名必须为小写 index/show/store/update/destroy 且签名匹配;路径变量需加正则约束防冲突;统一响应结构应通过中间件封装而非手动 json()。

Webman 本身不强制 RESTful 规范,但它的路由和响应机制天然适配——关键在于你是否在 config/route.php 中用对了 Route::resource(),以及控制器方法是否严格对应 HTTP 动词语义。否则,哪怕 URL 写成 /api/users,也只是一条普通 POST 路由,不是 RESTful。
Route::resource() 必须配合标准控制器方法名
很多人调用了 Route::resource('/api/users', app\controller\UserController::class),却在控制器里写 getUserList() 或 addUser(),结果 GET /api/users 直接 404。Webman 的 resource() 不是“自动猜方法”,它硬编码映射了 5 个固定动作:
-
index→GET /api/users -
show→GET /api/users/{id}(参数名必须叫$id,且方法签名要带它) -
store→POST /api/users -
update→PUT /api/users/{id} -
destroy→DELETE /api/users/{id}
控制器里少一个方法,对应请求就失败;方法名拼错(比如 Update 首字母大写),也匹配不上。别依赖 IDE 自动补全——手动检查方法名是否全小写、无下划线。
路径参数约束必须显式加正则,否则路由冲突
当你同时注册了 GET /api/users/{id} 和 GET /api/users/export,Webman 默认会把 /export 当成 {id} 的值,优先匹配前者,导致导出接口永远进不去。这不是 bug,是 FastRoute 的前缀最长匹配规则。
解决方式只有一种:给 {id} 加正则约束,例如:
Route::get('/api/users/{id:\d+}', [app\controller\UserController::class, 'show']);
Route::get('/api/users/export', [app\controller\UserController::class, 'export']);
这样 /export 就不会被当成数字 ID 匹配。所有含变量的路径,只要存在字面量同名子路径,就必须加约束,\d+、[a-zA-Z0-9_]+、[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}(UUID)按需选。
统一响应结构不能靠每个控制器手写 json()
企业级 API 要求所有接口返回格式一致:{"code":0,"msg":"success","data":{}} 或 {"code":1001,"msg":"参数错误"}。如果每个 index()、show() 里都写一遍 return json([...]),后期改字段名或加 trace_id 就得改十几处。
Webman 2.2.0版本强化了 TCP/UDP 服务支持,优化路由组管理,并增强异步任务处理能力。结合协程与连接池技术,Webman 能轻松应对高并发场景,适用于网站、接口服务、即时通讯、物联网及游戏开发,兼具高性能、灵活扩展与稳定可靠,是多场景 PHP 服务开发的理想选择。
正确做法是用中间件封装响应:
// app/middleware/ResponseFormat.php
<?php namespace app\middleware;
use support\Response;
use Webman\Http\Request;
class ResponseFormat
{
public function process(Request $request, \Closure $next): Response
{
$response = $next($request);
// 只处理 JSON 响应,跳过静态文件、重定向等
if ($response->header('content-type') === 'application/json') {
$origin = json_decode((string) $response->getBody(), true);
// 如果已是标准结构,不包裹;否则套一层
if (!isset($origin['code'])) {
return json(['code' => 0, 'msg' => 'success', 'data' => $origin]);
}
}
return $response;
}
}
然后在 config/middleware.php 中全局注册。注意:这个中间件必须放在最后,否则可能被其他中间件提前返回。
版本控制别用子域名,用 /v1/ 前缀并隔离路由文件
企业项目迟早要升级 API 版本。用 v1.api.example.com 看似清晰,但运维成本高(DNS、SSL、负载均衡都要配两套),而且 Webman 的 Router 不支持按 Host 分发。
更务实的做法是路径前缀 + 独立路由文件:
- 把 v1 路由全写在
routes/v1.php,v2 写在routes/v2.php - 在
config/route.php中按需引入:if (env('API_VERSION') === 'v1') include base_path('routes/v1.php'); - 所有 v1 接口 URL 以
/v1/开头,如GET /v1/users
这样开发时可并行维护两套逻辑,上线时只需改一个环境变量,无需动 Nginx 配置或重启服务。
真正难的不是写几个 json(),而是让所有开发者在新增接口时,下意识去查 Route::resource() 的方法映射表、给每个 {id} 加正则、把响应包装逻辑抽到中间件——这些细节一旦松懈,三个月后就会变成没人敢动的“祖传代码”。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!










