在Lumen中创建自定义错误页面

Kus*_*adi 7 laravel blade lumen

如何为Lumen上的错误创建自定义视图?我尝试创建resources/views/errors/404.blade.php,就像我们在Laravel 5中可以做的那样,但它不起作用.

luk*_*ter 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);
}
Run Code Online (Sandbox Code Playgroud)

并将其添加到Handler.php文件的顶部:

use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
Run Code Online (Sandbox Code Playgroud)

编辑:正如@YiJiang指出的那样,响应不仅要返回404视图,还要包含正确的状态代码.因此view()应该包含response()404作为状态代码传入的调用中.就像上面编辑的代码一样.

  • `使用Symfony\Component\HttpKernel\Exception\NotFoundHttpException;`可能需要添加,因为它位于不同的命名空间.(来自[Carlo V]的评论(http://stackoverflow.com/users/1025467/carlo-v)) (3认同)
  • 这是有问题的,因为您的响应将不会携带正确的HTTP状态代码.Lumen的文档解决了这个问题,但它也是错误的,因为它是从Laravel复制的(`ResponseFactory`类没有它在Laravel中的`view`方法).我最终得到了`return response(view("errors.$ status") - > render(),$ status);` (2认同)

Yi *_*ang 11

lukasgeiter的答案几乎是正确的,但是使用该view函数做出的响应将始终带有200HTTP状态代码,这对于爬虫或依赖它的任何用户代理来说都是有问题的.

流明文档试图解决这个问题,但因为它是从Laravel的复制,并流明的精简的版本给出的代码不起作用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);
    }
}
Run Code Online (Sandbox Code Playgroud)

这假设您将错误存储在errors视图下的目录中.