【问题标题】:Creating custom error page in Lumen在 Lumen 中创建自定义错误页面
【发布时间】:2015-07-25 19:49:44
【问题描述】:

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

【问题讨论】:

    标签: laravel blade lumen


    【解决方案1】:

    错误在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 作为状态码。就像上面编辑过的代码一样。

    【讨论】:

    • use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; 可能需要添加,因为它位于不同的命名空间中。 (来自Carlo V的评论)
    • 这是有问题的,因为您的响应不会携带正确的 HTTP 状态代码。 Lumen 的文档解决了这个问题,但它也是错误的,因为它是从 Laravel 复制过来的(ResponseFactory 类没有它在 Laravel 中的 view 方法)。我最终得到了return response(view("errors.$status")->render(), $status);
    • 谢谢@YiJiang,你真棒!
    • 感谢@YiJiang 指出要在回复中添加状态。我试图编辑上面的答案,但被拒绝了。在我看来,错误页面绝对应该返回 404 HTTP 响应代码。上面答案中的代码返回 200 响应代码,这是错误的,会导致 bot 混淆。
    • @lukasgeiter 谢谢!
    【解决方案2】:

    它对我不起作用,但我得到了它:

    if($e instanceof \Symfony\Component\HttpKernel\Exception\NotFoundHttpException) {
      return view('errors.404');
    }
    

    您可能还想添加

    http_response_code(404) 
    

    告诉搜索引擎页面的状态。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2014-02-22
        • 1970-01-01
        • 2014-11-10
        • 2010-09-13
        • 2016-05-14
        • 1970-01-01
        • 2013-07-13
        • 2014-01-27
        • 2017-10-03
        相关资源
        最近更新 更多