Laravel中使用missing方法时如何获取路由传入的不存在模型ID?
Laravel模型绑定缺失场景下获取请求ID的最优方案
我在Laravel路由中使用模型绑定,需要处理数据库中不存在对应ID的场景。按照文档说明,可以通过missing方法处理这种情况,但测试路由/document/idThatDoesNotExist时,无法从Request实例中获取传入的ID:
Route::middleware(['throttle:document']) ->resource('document', DocumentController::class) ->only(['show']) ->missing(function (Request $request) { $request->dd(); });
目前我通过正则从请求URI中提取ID作为临时方案,代码如下,想了解是否有更优的实现方式:
$document_id = preg_replace("/.*/document/(.*)/", "$1", $request->getRequestUri());
更优实现方案
直接通过Request的route()方法获取路由参数即可,不需要正则解析URI:
Route::middleware(['throttle:document']) ->resource('document', DocumentController::class) ->only(['show']) ->missing(function (Request $request) { $documentId = $request->route('document'); // 示例:返回自定义404响应 return response()->json([ 'message' => "ID为 {$documentId} 的文档不存在" ], 404); });
原理说明
Laravel路由系统会自动捕获路由参数的值,无论模型绑定是否命中(即对应ID的模型是否存在),都可以通过$request->route('参数名')获取到传入的参数值。这里的参数名document对应resource路由中show方法的默认参数名,和资源名称一致。这种方式比正则解析URI更可靠,当路由结构调整、URI携带查询参数时,都能稳定获取到目标ID,也更符合Laravel的设计规范。
内容的提问来源于stack exchange,提问作者parapente
相关产品推荐
相关产品推荐

