Lumen 中的自定义 404 页面

Posted

技术标签:

【中文标题】Lumen 中的自定义 404 页面【英文标题】:Custom 404 page in Lumen 【发布时间】:2016-05-14 22:22:39 【问题描述】:

我是 Lumen 的新手,想用这个框架创建一个应用程序。现在我遇到的问题是,如果某些用户输入了错误的 url => http://www.example.com/abuot(错误)=> http://www.example.com/about(正确),我想呈现一个自定义错误页面,它会在中间件级别发生是理想的。

此外,我可以检查当前 url 是否有效,但我不确定如何在中间件中“制作”视图,response()->view() 将不起作用。

如果有人能帮忙就太好了。

【问题讨论】:

Creating custom error page in Lumen的可能重复 @maiorano84 该文档适用于 Laravel,不适用于 Lumen。需要手动捕获和处理异常。 肯定是重复的,可惜这里的答案更好 【参考方案1】:

由于错误在App\Exceptions\Handler 中处理,这是处理它们的最佳位置。

如果您只是在自定义 404 错误页面之后,那么您可以很容易地做到这一点:

将此行添加到Handler 文件的顶部:

use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;

render 函数更改为如下所示:

public function render($request, Exception $e)

    if($e instanceof NotFoundHttpException)
        return response(view("errors.404"), 404);
    
    return parent::render($request, $e);

这假设您的自定义 404 页面存储在您的视图中的错误文件夹中,并将返回自定义错误页面以及 404 状态代码。

【讨论】:

谢谢,我在生产和开发环境都用过 instanceof 条件对我不起作用。替换为 $e->getStatusCode() == 404 并且有效。 对于那些 if 不起作用的人,请确保您导入类 use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; 或在 if 语句中指定完整路径 ($e instanceof \Symfony\Component\HttpKernel\Exception\NotFoundHttpException)【参考方案2】:

您可能需要添加它,这样当刀片发生故障时,错误页面处理程序不会抛出 php 错误。

public function render($request, Exception $exception)
 
   if (method_exists('Exception','getStatusCode'))

     if($exception->getStatusCode() == 404)
       return response(view("errors.404"), 404);
     

     if($exception->getStatusCode() == 500)
       return response(view("errors.500"), 404);
     
   
   return parent::render($request, $exception);
 

【讨论】:

不适合我亲爱的,在 Lumne 8 版本中仍然使用旧的 404 屏幕。谢谢。【参考方案3】:

我遇到了同样的情况。 response(view("errors.404"), 404)对我不起作用,所以我将其更改如下:

public function render($request, Exception $exception)

    if($exception instanceof NotFoundHttpException)
        return response(view('errors.404')->render(), 404);
    
    return parent::render($request, $exception);

【讨论】:

【参考方案4】:

我正在使用Lumen 8.x version,以下解决方案对我有用:

文件路径:‎▸ 应用 ▸ 例外 ▸ Handler.php

public function render($request, Throwable $exception)

    // start custom code
    if($exception->getStatusCode() == 404)
        return response(view("errors.404"), 404);
    
    if($exception->getStatusCode() == 500)
        return response(view("errors.500"), 404);
    
    // end custom code

    return parent::render($request, $exception);

不要忘记在/resources/views/errors 创建errors 文件夹,并在errors 文件夹中创建以下2 个新文件:

404.blade.php

500.blade.php

并在这些文件中添加您想要添加的 html 标记和消息。

很高兴为您提供帮助。感谢您提出这个问题。

【讨论】:

这对我来说看起来很有希望,但由于找不到 getStatusCode(),我进入了 Lumen 8。这是在哪里?

以上是关于Lumen 中的自定义 404 页面的主要内容,如果未能解决你的问题,请参考以下文章

重定向到 DjangoCMS 中的自定义 404 html 页面

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

MVC6 中的自定义选择性 404 页面

如何使用页面应用程序中的自定义页面更改默认的 404 错误页面

旧 ASP.Net 应用程序中的自定义错误页面不起作用

带有 JSON 的自定义 404 页面,没有重定向