在 Lumen 中创建自定义错误页面
Creating custom error page in Lumen
如何为 Lumen 上的错误创建自定义视图?我尝试创建 resources/views/errors/404.blade.php
,就像我们在 Laravel 5 中可以做的那样,但它不起作用。
错误在 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 指出的那样,响应不仅应该 return 404 视图,还应该包含正确的状态代码。因此 view()
应该包含在 response()
调用中,传入 404
作为状态代码。就像上面编辑过的代码一样。
它对我不起作用,但我可以使用它:
if($e instanceof \Symfony\Component\HttpKernel\Exception\NotFoundHttpException) {
return view('errors.404');
}
您可能还想添加
http_response_code(404)
告诉搜索引擎页面的状态。
几乎 正确,但是使用 view
函数做出的响应将始终携带 200
HTTP 状态代码,这对于爬虫或依赖它的任何用户代理来说都是有问题的。
Lumen documentation 试图解决这个问题,但给出的代码不起作用,因为它是从 Laravel 和 Lumen 的精简版 ResponseFactory
class 缺少 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
目录中。
如何为 Lumen 上的错误创建自定义视图?我尝试创建 resources/views/errors/404.blade.php
,就像我们在 Laravel 5 中可以做的那样,但它不起作用。
错误在 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 指出的那样,响应不仅应该 return 404 视图,还应该包含正确的状态代码。因此 view()
应该包含在 response()
调用中,传入 404
作为状态代码。就像上面编辑过的代码一样。
它对我不起作用,但我可以使用它:
if($e instanceof \Symfony\Component\HttpKernel\Exception\NotFoundHttpException) {
return view('errors.404');
}
您可能还想添加
http_response_code(404)
告诉搜索引擎页面的状态。
view
函数做出的响应将始终携带 200
HTTP 状态代码,这对于爬虫或依赖它的任何用户代理来说都是有问题的。
Lumen documentation 试图解决这个问题,但给出的代码不起作用,因为它是从 Laravel 和 Lumen 的精简版 ResponseFactory
class 缺少 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
目录中。