资讯专栏INFORMATION COLUMN

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

pepperwang / 2295人阅读

摘要:所以,现在我们可以使用具有正常页面和页脚的应用布局,来替代简单的视图,同时还能给用户显示一条友好的提示信息。

译文首发于 使用 Laravel 5.5+ 更好的来实现 404 响应,转载请注明出处!

Laravel 5.5.10 封装了两个有用的路由器方法,可以帮助我们为用户提供更好的 404 页面。现在,当抛出 404 异常时,Laravel 会显示一个漂亮的 404.blade.php 视图文件,你可以自定义显示给用户 UI,但在该视图中,你无权访问 sessioncookie,身份验证(auth)等...

在 laravel 5.5.10 中,我们有一个新的 Route::fallback() 方法,用于定义当没有其他路由与请求匹配时 Laravel 回退的路由。

Route::fallback(function () {
    return "Sorry" . auth()->user()->name . "! This page does not exist.";
});

所以,现在我们可以使用具有正常页面和页脚的应用布局,来替代简单的 404 视图,同时还能给用户显示一条友好的提示信息。

Route::fallback(function() {
    return response()->view("notFound", [], 404);
});
@extends("layout.app")

@section("content")
    

Sorry! this page doesn"t exist.

@stop

当 Laravel 渲染这个回退(fallback)路由时,会运行所有的中间件,因此当你在 web.php 路由文件中定义了回退路由时,所有处在 web 中间件组的中间件都会被执行,这样我们就可以获取 session 数据了。

API 接口说明

现在当你点击 /non-existing-page 时,你会看到在回退路由中定义的视图,甚至当你点击 /api/non-existing-endpoint 时,如果你也不想提供这个接口,你可以到 api 回退路由中定义 JSON 响应,让我们到 api.php 路由文件中定义另外一个回退路由:

Route::fallback(function() {
    return response()->json(["message" => "Not Found!]);
});

由于 api 中间件组带有 /api 前缀,所有带有 /api 前缀的未定义的路由,都会进入到 api.php 路由文件中的回退路由,而不是 web.php 路由文件中所定义的那个。

使用 abort(404) 和 ModelNotFound 异常

当使用 abort(404) 时会抛出一个 NotFoundHttpException,此时处理器会为我们渲染出 404.blade.php 视图文件,同样的 ModelNotFoundException 异常也会做同样的处理,那么我们应该如何如何处理才能在更好的渲染出回退路由的视图,而不是一个普通的视图呢?

class Handler extends ExceptionHandler
{
    public function render($request, Exception $exception)
    {
        if ($exception instanceof NotFoundHttpException) {
            return Route::responseWithRoute("fallback");
        }

        if ($exception instanceof ModelNotFoundException) {
            return Route::responseWithRoute("fallback");
        }

        return parent::render($request, $exception);
    }
}

Route::respondWithRoute("fallback") 回去跑名为 fallback 的路由,我们可以像下面这样为回退路由命名:

Route::fallback(function() {
    return response()->view("notFound", [], 404);
})->name("fallback");

甚至,你还可以为特定的资源指定回退路由:

if ($exception instanceof ModelNotFoundException) {
    return $exception->getModel() == Server::class
                ? Route::respondWithRoute("serverFallback") 
                : Route::respondWithRoute("fallback");
}

现在我们需要在路由文件中定义这个回退路由:

Route::fallback(function(){
    return "We could not find this server, there are other ". auth()->user()->servers()->count() . " under your account ......";
})->name("serverFallback");
原文

Better 404 responses using Laravel 5.5+

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/29379.html

相关文章

  • Laravel 5.5 官方推荐 Nginx 配置学习

    摘要:表示该页面可以在相同域名页面的中展示。表示允许过滤器,指示浏览器在检测到攻击后禁止加载整个页面。该文件也确实没有必要记录到日志中,而且大部分网站并不存在文件。 Laravel 5.5 版本官方放出了 Nginx 服务器的配置,中文文档:服务器配置 Nginx server { listen 80; server_name example.com; root /e...

    mating 评论0 收藏0
  • Laravel 5.5 官方推荐 Nginx 配置学习

    摘要:表示该页面可以在相同域名页面的中展示。表示允许过滤器,指示浏览器在检测到攻击后禁止加载整个页面。该文件也确实没有必要记录到日志中,而且大部分网站并不存在文件。 Laravel 5.5 版本官方放出了 Nginx 服务器的配置,中文文档:服务器配置 Nginx server { listen 80; server_name example.com; root /e...

    v1 评论0 收藏0
  • PHP / Laravel API 开发推荐阅读清单

    showImg(https://segmentfault.com/img/bV6aHV?w=1280&h=800); 社区优秀文章 Laravel 5.5+passport 放弃 dingo 开发 API 实战,让 API 开发更省心 - 自造车轮。 API 文档神器 Swagger 介绍及在 PHP 项目中使用 - API 文档撰写方案 推荐 Laravel API 项目必须使用的 8 个...

    shmily 评论0 收藏0
  • 使用docker搭建laravel开发环境

    摘要:已经集成需要使用的环境,只需要简单修改配置就能搭建环境提供开发,对开发及管理来说真是一味良方。目前能正常访问文件。 为何用docker? 在电脑还是window系统的时候,经常需要基于vm服务搭建一套环境才能更好地(应该是更贴近线上环境)进行开发,而现在在docker的神秘光环底下已经能实现用最小的资源搭建本地开发环境,同时能更好地迁移到其他地方。 前置知识 了解docker安装及使...

    fish 评论0 收藏0
  • 使用docker搭建laravel开发环境

    摘要:已经集成需要使用的环境,只需要简单修改配置就能搭建环境提供开发,对开发及管理来说真是一味良方。目前能正常访问文件。 为何用docker? 在电脑还是window系统的时候,经常需要基于vm服务搭建一套环境才能更好地(应该是更贴近线上环境)进行开发,而现在在docker的神秘光环底下已经能实现用最小的资源搭建本地开发环境,同时能更好地迁移到其他地方。 前置知识 了解docker安装及使...

    JouyPub 评论0 收藏0

发表评论

0条评论

pepperwang

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<