Laravel如何按ID设置资源路由并获取ID?defaults方法报错
解决Laravel资源路由无法设置默认参数的问题
问题原因
报错Method Illuminate\Routing\PendingResourceRegistration::defaults does not exist,是因为Route::resource()返回的是PendingResourceRegistration对象(用于批量生成资源路由的注册器),并非单个路由实例,所以不能直接调用defaults()方法。
解决方案
方案一:遍历生成的资源路由添加默认参数
定义完资源路由后,筛选出对应控制器的所有路由,逐个设置默认参数:
use App\Http\Controllers\Aaa\XxxController as AaaXxxController; use App\Http\Controllers\Bbb\XxxController as BbbXxxController; // 注册aaa资源路由 Route::resource('/aaa', AaaXxxController::class); // 给该控制器下所有路由添加xxxID默认值 foreach (Route::getRoutes()->getRoutesByAction(AaaXxxController::class) as $route) { $route->defaults('xxxID', 'aaa'); } // 同理处理bbb资源路由 Route::resource('/bbb', BbbXxxController::class); foreach (Route::getRoutes()->getRoutesByAction(BbbXxxController::class) as $route) { $route->defaults('xxxID', 'bbb'); }
方案二:路由分组内绑定默认参数
将资源路由放在前缀分组中,遍历分组内的路由设置默认值:
use App\Http\Controllers\Aaa\XxxController as AaaXxxController; use App\Http\Controllers\Bbb\XxxController as BbbXxxController; Route::prefix('aaa')->group(function () { $resource = Route::resource('/', AaaXxxController::class)->names('aaa'); // 给分组内所有资源路由设置默认参数 foreach ($resource->getRoutes() as $route) { $route->defaults('xxxID', 'aaa'); } }); Route::prefix('bbb')->group(function () { $resource = Route::resource('/', BbbXxxController::class)->names('bbb'); foreach ($resource->getRoutes() as $route) { $route->defaults('xxxID', 'bbb'); } });
方案三:从路由前缀自动获取xxxID(推荐)
不需要在路由里额外配置,直接在父控制器中通过请求的路由前缀推导xxxID,代码更简洁:
修改父控制器方法:
use Illuminate\Http\Request; public function index(Request $request) { // 从路由前缀获取xxxID,去掉首尾斜杠 $xxxID = trim($request->route()->getPrefix(), '/'); // 原逻辑继续执行 } public function update(Request $request, $id) { $xxxID = trim($request->route()->getPrefix(), '/'); // 原逻辑继续执行,id参数正常接收 }
这个方案不需要修改路由代码,直接利用URL前缀自动获取所需的xxxID参数,同时保留资源路由的id参数正常传递。
内容的提问来源于stack exchange,提问作者黃梓榆
相关产品推荐
相关产品推荐

