如何为Lumen上的错误创建自定义视图?我尝试创建resources/views/errors/404.blade.php
,就像我们在Laravel 5中可以做的那样,但它不起作用。
答案 0 :(得分:16)
错误在App\Exceptions\Handler
内处理。要显示404页面,请将render()
方法更改为:
public function render($request, Exception $e)
{
if($e instanceof NotFoundHttpException){
return response(view('errors.404'), 404);
}
return parent::render($request, $e);
}
并将其添加到Handler.php文件的顶部:
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
编辑:正如@YiJiang指出的那样,响应不仅要返回404视图,还要包含正确的状态代码。因此,view()
应包含在response()
调用中,作为状态代码传入404
。就像上面编辑的代码一样。
答案 1 :(得分:9)
The answer by lukasgeiter 几乎正确,但使用view
函数进行的响应将始终带有200
HTTP状态代码,这对于抓取工具或任何依赖它的用户代理。
Lumen documentation试图解决这个问题,但是给出的代码不起作用,因为它是从Laravel中复制的,并且Lumen的ResponseFactory
类的精简版本缺少view
方法
这是我目前正在使用的代码。
use Symfony\Component\HttpKernel\Exception\HttpException;
[...]
public function render($request, Exception $e)
{
if ($e instanceof HttpException) {
$status = $e->getStatusCode();
if (view()->exists("errors.$status")) {
return response(view("errors.$status"), $status);
}
}
if (env('APP_DEBUG')) {
return parent::render($request, $e);
} else {
return response(view("errors.500"), 500);
}
}
这假设您将错误存储在视图下的errors
目录中。
答案 2 :(得分:0)
它对我没有用,但我得到了它:
if($e instanceof \Symfony\Component\HttpKernel\Exception\NotFoundHttpException) {
return view('errors.404');
}
您可能还想添加
http_response_code(404)
告诉搜索引擎有关页面状态的信息。