译文首发于 使用 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')<h3>Sorry! this page doesn't exist.</h3>
@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://segmentfault.com/a/1190000016245299

转载于:https://www.cnblogs.com/lalalagq/p/9971595.html

使用 Laravel 5.5+ 更好的来实现 404 响应相关推荐

  1. 组合使用Laravel和vfsStream测试文件上传

    核心要点 \ 在应用开发中,测试是很重要的,在诸多的开发工具中,测试驱动开发是很伟大的一项: \ 测试文件上传并不像人们想象的那么简单: \ 目前,有很多很棒,但不为大家所熟知的测试工具: \ Lar ...

  2. larvel 中的api.php_Laravel API 系列教程(一): 基于 Laravel 5.5 构建 测试 RESTful API...

    Laravel API 系列教程(一): 基于 Laravel 5.5 构建 & 测试 RESTful API 由 学院君 创建于2年前, 最后更新于 9个月前 版本号 #3 171702 v ...

  3. laravel $request 多维数组取值_大白话 Laravel 中间件

    Laravel 中间件是什么? 简而言之,中间件在 laravel 中的作用就是过滤 HTTP 请求,根据不同的请求来执行不同的逻辑操作. 我们可以通过中间件实现以下功能: 指定某些路由 设置 HTT ...

  4. api laravel 统一返回方法_Laravel API 错误处理:当异常时,如何返回消息

    image 基于 API 的项目开发越来越受欢迎,并且使用 Laravel 就能很容易实现.但是在针对如何处理各种异常的话题很少被提及.所以 API 的使用者们经常会抱怨除了收到 Server err ...

  5. Laravel源码解析之HTTP Kernel

    由于 PHP 可以处理 WEB 和 CLI 两种接口请求,所以 Laravel中设计 HttpKernel 和 ConsoleKernel 来处理这两种类型的请求,Http Kernel是Larave ...

  6. Laravel核心解读--HTTP内核

    Http Kernel Http Kernel是Laravel中用来串联框架的各个核心组件来网络请求的,简单的说只要是通过public/index.php来启动框架的都会用到Http Kernel,而 ...

  7. laravel validate 验证器

    1.简介 Laravel 提供了多种方法来验证应用输入数据.默认情况下,Laravel 的控制器基类使用ValidatesRequests trait,该trait提供了便利的方法通过各种功能强大的验 ...

  8. php基础 快速入门文档,快速入门 - Laravel 5.8 中文文档手册 - php中文网手册

    Eloquent:入门 简介 Laravel 的 Eloquent ORM 提供了一个漂亮.简洁的 ActiveRecord 实现来和数据库交互.每个数据库表都有一个对应的「模型」用来与该表交互.你可 ...

  9. Laravel 5.5 表单验证

    简介 Laravel 提供了多种方法来验证请求输入数据.默认情况下,Laravel 的控制器基类使用 ValidatesRequests trait,该 trait 提供了便捷方法通过各种功能强大的验 ...

  10. Laravel 6.0

    Laravel 学习交流 QQ 群:375462817 本记录文档前言 Laravel 文档写的很好,只是新手看起来会有点吃力,需要结合经验和网上的文章,多读.细读才能更好的理解.多读.细读官方文档! ...

最新文章

  1. github入门教程
  2. [poj]poj1860(SPFA)
  3. java扑克牌抽牌_[java,2018-06-26] 扑克牌抽牌求和问题
  4. java开发环境安装原理,java开发环境搭建 java开发环境的完整搭建过程
  5. Spring in Action 3 (翻译)
  6. github 公钥 私钥_搭建自己的技术博客系列 2:把 Hexo 博客部署到 GitHub 上
  7. Kafka是如何处理Netflix每天2万亿条消息的?
  8. python 多核并行计算_嫌Python太慢?并行运算Process Pools三行代码给你4倍提速!
  9. 【白皮书分享】2020智能体白皮书-华为.pdf(附下载链接)
  10. vue-router 报错:Navigation cancelled from“/…“ to “/…“ with a new navigation.
  11. 唐宇迪机器学习课程笔记:随机森林
  12. 计算机需要那些高中数学知识点,高中必考数学知识点归纳整理
  13. RUBY发送验证码通知短信(互亿无线)
  14. 西门子200PLC指令详解——位逻辑指令
  15. 数据库实验八 触发器实验
  16. **无人机水平方向四环串级控制,竖直方向三环串级控制
  17. 百度网盘断点续传下载工具IDM
  18. 迅雷某页面存在sql注入漏洞
  19. 关于developer express 的RepositoryItemCheckEdit 不能多选的问题
  20. mysql带中文日期转换_【MySQL】日期时间格式转换_MySQL

热门文章

  1. 高并发下如何保证数据库和缓存双写一致性?
  2. Java泛型通配符T,E,K,V
  3. (六)mybatis-spring集成完整版
  4. Python正则表达式指南下半部
  5. CentOS中文乱码问题
  6. Oracle回收站使用全攻略
  7. 一个老板向员工发的牢骚
  8. 修复IPSEC Services服务无法启动的问题
  9. 03_后台管理页面商品列表查询
  10. [生活日记] 社会真的这么乱?尼姑也行骗,道德何在