使所有错误状态代码 return 成为一个自定义视图

Make all error status codes return a single custom view

By default、Laravel 在 resources/views/errors 下查找错误视图,return 查找相关状态代码的相应视图,例如。 404 或 403。我不想手动创建所有这些视图,而是想对所有错误代码使用我自己的自定义视图,实际错误代码和消息使用 getMessage() 和任何其他可能的辅助函数在视图中动态显示我可以使用。

这样我就可以正常执行此操作:

abort(<statuscode>, <mymessage>)

...但总是 return 只有一个视图。

请注意,我所要求的 与所要求的 here 不同 而非 ,即无论其实际状态代码如何,都将所有错误强制为 404s .我想保持状态代码应有的样子,只需将它们全部呈现在同一视图中即可。

default exception handler 中,一个名为 getHttpExceptionView() 的方法将视图确定为 return。只需用您想要的逻辑在 App\Exceptions\Handler class 中覆盖它。

use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface;

protected function getHttpExceptionView($e)
{
    if ($e->getStatusCode() === 409) {
        return "exceptions.special";
    }
    return "exceptions.default";
}

您正在 return 标准视图路径,dot-separated 如果您正在使用目录。

所述,我将以下内容添加到 App\Exceptions\Handler.php 文件内 Handler class 的底部:

class Handler extends ExceptionHandler
{
    //  Default classes
    //  ...

    protected function getHttpExceptionView($e)
    {
        //  409 errors are handled specially
        //  Remove this if block entirely to serve them with the same error page as below
        if ($e->getStatusCode() === 409) {
            return "exceptions.special"; 
        }
        return "errors.custom"; // Return a "custom" file under "resources/views/errors"
    }
}

然后我将以下内容添加到我的错误视图中:

<h1 class="primary-header">
  @if($exception)
    {{"Error " . $exception->getStatusCode().":"}}
    {{ $exception->getMessage() ? $exception->getMessage() : "page not found" }}
  @else {{ "Generic error: page not found" }}
  @endif
</h1>

这现在允许我在控制器中使用 abort() 函数,例如,抛出带有可选消息的任何 HTTP 错误代码:

Route::get("/failtest/", function (){
        abort(404, "someone messed up");
});