如何在Lumen中创建通配符路由适配多控制器的同名findAll方法?
问题原因
你之前的闭包路由只是返回了控制器方法的字符串标识,框架不会自动解析这个字符串调度控制器执行,只会将其作为普通文本响应返回。
可行实现方案
你可以在路由闭包中手动完成控制器的实例化和方法调用,代码如下:
$router->group(['middleware' => 'jwt.auth'], function () use ($router) { // 注意:通配路由必须放在所有固定路由之后,避免覆盖其他路由 $router->get('{resource}', function (Illuminate\Http\Request $request, string $resource) { // 拼接控制器完整类名,请替换为你实际的控制器命名空间 $controllerClass = "\\App\\Http\\Controllers\\" . ucfirst($resource) . "Controller"; // 校验控制器和方法是否存在,不存在直接返回404 if (!class_exists($controllerClass) || !method_exists($controllerClass, 'findAll')) { abort(404); } // 调用控制器方法,自动处理构造函数和方法参数的依赖注入 return app()->call([$controllerClass, 'findAll'], ['request' => $request]); })->where('resource', '[a-z_-]+'); // 正则约束资源名格式,可根据你的需求调整 });
注意事项
- 通配路由的优先级低于固定路由,所以必须定义在所有固定路由的末尾,否则会导致你的其他固定路由无法被匹配
- 如果你需要支持更多通用方法,比如详情查询、新增、更新等,可以扩展路由规则,增加
{action}参数拼接对应的方法名 - 可以根据你的业务场景调整
where中的正则规则,比如如果资源名包含大写字母、数字,可以修改正则匹配规则
内容的提问来源于stack exchange,提问作者Firze
相关产品推荐
相关产品推荐

