框架外使用illuminate/routing访问未定义路由无法正常展示404页面问题
解决方案
你绝对不要直接修改vendor目录下的源码,这种操作会破坏组件原有逻辑,且后续composer更新时会直接覆盖你的修改,完全不具备可维护性。你遇到的两个报错原因和修复方案如下:
错误原因
- 最初的NotFoundHttpException报错,是因为独立使用路由组件时没有配置异常捕获逻辑,未匹配路由抛出的异常没有被处理直接暴露。
- 修改AbstractRouteCollection.php后的setContainer报错,是因为你替换了抛出异常的逻辑直接引入404文件,原有路由匹配流程本该得到路由实例/抛出异常,现在得到空值,后续调度逻辑调用空对象的方法就会触发报错。
正确修复方案
你只需要在路由调度外层加异常捕获逻辑即可,不需要动任何源码:
<?php use Illuminate\Events\Dispatcher; use Illuminate\Routing\Router; use Illuminate\Http\Request; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; $dispatcher = new Dispatcher; $router = new Router($dispatcher); $router->get( '/', [ HomeController::class, 'index' ] ); $request = Request::createFromGlobals(); try { $response = $router->dispatch($request); } catch (NotFoundHttpException $e) { // 捕获404异常,设置响应状态码后加载自定义404页面 http_response_code(404); require_once(ROOT . DS . "responses" . DS . "error" . DS . "404.php"); exit; } catch (Throwable $e) { // 可在此处补充其他异常的处理逻辑,比如500错误页加载 http_response_code(500); exit; } $response->send();
如果需要更符合Laravel响应规范的写法,也可以在捕获异常后返回响应实例:
catch (NotFoundHttpException $e) { $content = file_get_contents(ROOT . DS . "responses" . DS . "error" . DS . "404.php"); $response = new Illuminate\Http\Response($content, 404); }
内容的提问来源于stack exchange,提问作者黃梓榆
相关产品推荐
相关产品推荐

