使用 Laravel 5.5+ 更好的来实现 404 响应
译文首发于 使用 Laravel 5.5+ 更好的来实现 404 响应,转载请注明出处!
Laravel 5.5.10 封装了两个有用的路由器方法,可以帮助我们为用户提供更好的 404 页面。现在,当抛出 404 异常时,Laravel 会显示一个漂亮的 404.blade.php 视图文件,你可以自定义显示给用户 UI,但在该视图中,你无权访问 session,cookie,身份验证(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 响应相关推荐
- 组合使用Laravel和vfsStream测试文件上传
核心要点 \ 在应用开发中,测试是很重要的,在诸多的开发工具中,测试驱动开发是很伟大的一项: \ 测试文件上传并不像人们想象的那么简单: \ 目前,有很多很棒,但不为大家所熟知的测试工具: \ Lar ...
- larvel 中的api.php_Laravel API 系列教程(一): 基于 Laravel 5.5 构建 测试 RESTful API...
Laravel API 系列教程(一): 基于 Laravel 5.5 构建 & 测试 RESTful API 由 学院君 创建于2年前, 最后更新于 9个月前 版本号 #3 171702 v ...
- laravel $request 多维数组取值_大白话 Laravel 中间件
Laravel 中间件是什么? 简而言之,中间件在 laravel 中的作用就是过滤 HTTP 请求,根据不同的请求来执行不同的逻辑操作. 我们可以通过中间件实现以下功能: 指定某些路由 设置 HTT ...
- api laravel 统一返回方法_Laravel API 错误处理:当异常时,如何返回消息
image 基于 API 的项目开发越来越受欢迎,并且使用 Laravel 就能很容易实现.但是在针对如何处理各种异常的话题很少被提及.所以 API 的使用者们经常会抱怨除了收到 Server err ...
- Laravel源码解析之HTTP Kernel
由于 PHP 可以处理 WEB 和 CLI 两种接口请求,所以 Laravel中设计 HttpKernel 和 ConsoleKernel 来处理这两种类型的请求,Http Kernel是Larave ...
- Laravel核心解读--HTTP内核
Http Kernel Http Kernel是Laravel中用来串联框架的各个核心组件来网络请求的,简单的说只要是通过public/index.php来启动框架的都会用到Http Kernel,而 ...
- laravel validate 验证器
1.简介 Laravel 提供了多种方法来验证应用输入数据.默认情况下,Laravel 的控制器基类使用ValidatesRequests trait,该trait提供了便利的方法通过各种功能强大的验 ...
- php基础 快速入门文档,快速入门 - Laravel 5.8 中文文档手册 - php中文网手册
Eloquent:入门 简介 Laravel 的 Eloquent ORM 提供了一个漂亮.简洁的 ActiveRecord 实现来和数据库交互.每个数据库表都有一个对应的「模型」用来与该表交互.你可 ...
- Laravel 5.5 表单验证
简介 Laravel 提供了多种方法来验证请求输入数据.默认情况下,Laravel 的控制器基类使用 ValidatesRequests trait,该 trait 提供了便捷方法通过各种功能强大的验 ...
- Laravel 6.0
Laravel 学习交流 QQ 群:375462817 本记录文档前言 Laravel 文档写的很好,只是新手看起来会有点吃力,需要结合经验和网上的文章,多读.细读才能更好的理解.多读.细读官方文档! ...
最新文章
- github入门教程
- [poj]poj1860(SPFA)
- java扑克牌抽牌_[java,2018-06-26] 扑克牌抽牌求和问题
- java开发环境安装原理,java开发环境搭建 java开发环境的完整搭建过程
- Spring in Action 3 (翻译)
- github 公钥 私钥_搭建自己的技术博客系列 2:把 Hexo 博客部署到 GitHub 上
- Kafka是如何处理Netflix每天2万亿条消息的?
- python 多核并行计算_嫌Python太慢?并行运算Process Pools三行代码给你4倍提速!
- 【白皮书分享】2020智能体白皮书-华为.pdf(附下载链接)
- vue-router 报错:Navigation cancelled from“/…“ to “/…“ with a new navigation.
- 唐宇迪机器学习课程笔记:随机森林
- 计算机需要那些高中数学知识点,高中必考数学知识点归纳整理
- RUBY发送验证码通知短信(互亿无线)
- 西门子200PLC指令详解——位逻辑指令
- 数据库实验八 触发器实验
- **无人机水平方向四环串级控制,竖直方向三环串级控制
- 百度网盘断点续传下载工具IDM
- 迅雷某页面存在sql注入漏洞
- 关于developer express 的RepositoryItemCheckEdit 不能多选的问题
- mysql带中文日期转换_【MySQL】日期时间格式转换_MySQL