Laravel存在Route::fallback时如何判断指定路由是否真实存在
问题根因
你遇到的现象确实是fallback路由导致的:当你调用Route::getRoutes()->match($request)时,Laravel的路由匹配逻辑会优先匹配所有常规路由,全不匹配的话就会命中已注册的fallback路由,永远不会抛出NotFoundHttpException。
实现方案
方案1:匹配路由时排除fallback路由
你可以过滤掉路由集合里的fallback路由之后再做匹配,这样不存在的路由就会符合预期抛出异常:
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; Route::fallback(function () use ($routes) { try { $targetPath = 'does-not-exist'; // 如果目标路由有请求方法限制,第二个参数传对应的请求方法,比如POST $next = Request::create($targetPath); // 过滤掉所有fallback路由 $nonFallbackRoutes = collect(Route::getRoutes()->getRoutes())->reject(function ($route) { return $route->isFallback; }); // 用过滤后的路由集合做匹配 $matchedRoute = $nonFallbackRoutes->first(function ($route) use ($next) { return $route->matches($next, false); }); if (!$matchedRoute) { throw new NotFoundHttpException(); } // 路由存在的后续逻辑,比如获取目标路由响应 $response = app()->handle($next); } catch (NotFoundHttpException $e) { // 路由不存在的处理逻辑 } });
方案2:简化版路由存在性判断
如果你的需求只是判断路由是否存在,不需要捕获异常,可以用更简洁的写法:
$targetPath = 'your-target-path'; $request = Request::create($targetPath); // 直接判断非fallback路由中是否有匹配项 $routeExists = collect(Route::getRoutes()->getRoutes()) ->reject(fn($route) => $route->isFallback) ->contains(fn($route) => $route->matches($request, false)); if (!$routeExists) { // 路由不存在的处理逻辑 } // 路由存在时直接获取响应内容 $response = app()->handle($request);
内容的提问来源于stack exchange,提问作者Chris Wright
相关产品推荐
相关产品推荐

