在 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 目录中。