使所有错误状态代码返回一个自定义视图



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

这将允许我像往常一样这样做:

abort(<statuscode>, <mymessage>)

但总是只返回一个视图。

请注意,我所要求的是而不是与这里所要求的相同,即强制所有错误到404,无论它们的实际状态代码如何。我想保持状态代码的应有状态,只需在同一视图中呈现它们即可。

在默认的异常处理程序中,一个名为getHttpExceptionView()的方法确定要返回的视图。只需在AppExceptionsHandler类中使用所需的逻辑覆盖它。

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

您将返回一个标准视图路径,如果您使用的是目录,则以点分隔。

根据miken32的回答,我在AppExceptionsHandler.php文件中的Handler类的底部添加了以下内容:

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");
});

相关内容

最新更新