当前位置: 首页 > 后端技术 > PHP

使用 Laravel 5.5+ 更好的来实现 404 响应

时间:2023-03-29 18:40:30 PHP

Laravel5.5+更好的404响应Laravel5.5.10包装了两个有用的路由器方法,帮助我们为用户提供更好的404页面。现在,当抛出404异常时,Laravel将显示一个漂亮的404.blade.php视图文件,您可以自定义该文件以显示用户UI,但在该视图中,您无权访问会话、cookie、身份验证(auth)等等...在laravel5.5.10中,我们有一个新的Route::fallback()方法来定义当没有其他路由匹配请求时Laravel回退到的路由。Route::fallback(function(){return'Sorry'.auth()->user()->name.'!此页面不存在。';});所以现在我们可以使用普通的和简单的应用布局的页面来代替简单的404视图,同时向用户显示友好的提示信息。Route::fallback(function(){returnresponse()->view('notFound',[],404);});@extends('layout.app')@section('content')

对不起!这个页面不存在。

@stopLaravel在渲染这个回退(fallback)路由时,会运行所有的中间件,所以当你在web.php路由文件中定义回退路由时,web中的所有中间件中间件组将被执行,以便我们可以获得会话数据。API接口描述现在当你点击/non-existing-page时,你会看到fallback路由中定义的视图,即使当你点击/api/non-existing-endpoint时,如果你不想提供这个接口,你可以在api回退路由中定义JSON响应,让我们在api.php路由文件中定义另一个回退路由:Route::fallback(function(){returnresponse()->json(['message'=>'NotFound!]);});由于api中间件组带有/api前缀,所有带有/api前缀的未定义路由都会进入api.php路由文件中的fallback路由,而不是web.php路由文件中定义的路由。使用abort(404)和ModelNotFound异常使用abort(404)时会抛出NotFoundHttpException,处理器会为我们渲染404.blade.php视图文件,同样的ModelNotFoundException异常也会以同样的方式处理,那么我们应该如何处理才能更好地渲染回退路由的视图而不是普通视图呢?classHandlerextendsExceptionHandler{publicfunctionrender($request,Exception$exception){if($exceptioninstanceofNotFoundHttpException){returnRoute::responseWithRoute('fallback');}if($exceptioninstanceofModelNotFoundExceptionith){returnRoWute('fallback');}returnparent::render($request,$exception);}}Route::respondWithRoute('fallback')返回名为fallback的路由,我们可以这样命名回退路由:Route::fallback(function(){returnresponse()->view('notFound',[],404);})->名称('回退');甚至,您可以为特定资源路由指定回退:if($exceptioninstanceofModelNotFoundException){return$exception->getModel()==Server::class?路线::respondWithRoute('serverFallback'):Route::respondWithRoute('fallback');}现在我们需要在路由文件中定义这个回退路由:Route::fallback(function(){return'Wecouldnotfindthisserver,thereareother'.auth()->user()->servers()->count().'在你的账号下......';})->name('serverFallback');原文Better404responsesusingLaravel5.5+