Php 如何在laravel 5.2中显示500内部服务器错误页面?

Php 如何在laravel 5.2中显示500内部服务器错误页面?,php,laravel,laravel-5.2,Php,Laravel,Laravel 5.2,我想显示页面500内部服务器错误页面。当用户在项目中出现语法错误时,有人能帮助我吗?如果我在语法上犯了一些错误,我想展示这个特殊的刀片 在resources/views/errors文件夹中创建一个名为500.blade.php的文件 Laravel可以轻松显示各种HTTP的自定义错误页面 状态代码。例如,如果要自定义的错误页 500个HTTP状态代码,创建一个resources/views/errors/500.blade.php。此文件将用于处理应用程序生成的所有500个错误 问题是,Lar

我想显示页面500内部服务器错误页面。当用户在项目中出现语法错误时,有人能帮助我吗?如果我在语法上犯了一些错误,我想展示这个特殊的刀片

resources/views/errors
文件夹中创建一个名为
500.blade.php
的文件

Laravel可以轻松显示各种HTTP的自定义错误页面 状态代码。例如,如果要自定义的错误页 500个HTTP状态代码,创建一个
resources/views/errors/500.blade.php
。此文件将用于处理应用程序生成的所有500个错误

问题是,Laravel只会自动呈现属于
HttpException
实例的异常的错误页面。不幸的是,当服务器抛出错误(方法不存在、变量未定义等)时,它实际上抛出了一个
FatalErrorException
。因此,它是未捕获的,并向下流到
SymfonyDisplayer()
,它要么给您提供跟踪(debug true),要么给出丑陋的一行“哎呀,好像出了什么问题”(debug false)

要解决此问题,您必须将其添加到
render
方法的
app/Exceptions/Handler

# /app/Exceptions/Handler.php

# use Symfony\Component\Debug\Exception\FlattenException;

# public function render($request, Exception $e)

$exception = FlattenException::create($e);
$statusCode = $exception->getStatusCode($exception);

if ($statusCode === 404 or $statusCode === 500) {
    return response()->view('errors.' . $statusCode, [], $statusCode);
}

您需要创建处理程序来捕获处理程序中的
FatalErrorExceptions
,如下代码所示:

处理程序 在app/Exceptions/Handler.php中

public function render($request, Exception $e)
{

    // 404 page when a model is not found
    if ($e instanceof ModelNotFoundException) {
        return response()->view('errors.404', [], 404);
    }

    // custom error message
    if ($e instanceof \ErrorException) {
        return response()->view('errors.500', [], 500);
    } else {
        return parent::render($request, $e);
    }

    return parent::render($request, $e);
}
查看 请参阅
resources/views/errors/500.blade.php
。如果不存在,则创建它


您可以通过

获得更详细的信息或其他方式。我的解决方案很简单,只需将Exceptions\Handler.php文件中的render()方法替换为:

/**
 * Render an exception into an HTTP response.
 *
 * @param \Illuminate\Http\Request $request
 * @param \Exception               $exception
 *
 * @return \Illuminate\Http\Response
 */
public function render($request, Exception $exception)
{
    if ($request->expectsJson()) {
        return $this->renderJson($request, $exception);
    }

    if ($this->shouldReport($exception) && app()->environment('production')) {
        $exception = new HttpException(500, $exception->getMessage(), $exception);
    }

    return parent::render($request, $exception);
}
它将显示500页,如果应用程序在生产环境中。您需要在resources/views/errors文件夹中有500.blade.php视图

    // app/Exceptions/Handler.php

    protected function prepareResponse($request, Exception $e)
    {
        if($this->isHttpException($e) === false && config('app.debug') === false)     {
            $e = new HttpException(500);
        }

        return parent::prepareResponse($request, $e);
    }
就像埃米特说的

问题是,Laravel只会自动渲染 作为HttpException实例的异常的错误页


因此,我的解决方案是用HttpException替换任何非HttpException的异常。

在app\Exceptions\Handler中创建以下方法:

protected function convertExceptionToResponse(Exception $e)
{
        $e = FlattenException::create($e);
        return response()->view('errors.500', ['exception' => $e], $e->getStatusCode(), $e->getHeaders());
}

它将覆盖父类(Illumb\Foundation\Exceptions\Handler)中显示whoops页面的函数。

在Laravel 5.4中,您可以覆盖
app\Exception\Handler.php中的
prepareException
函数:

/**
 * @inheridoc
 */
protected function prepareException(Exception $e)
{
    $exception = parent::prepareException($e);

    if(!config('app.debug')) {
        if(!$exception instanceof HttpException && $this->shouldReport($exception)) {
            $exception = new HttpException(500);
        }
    }

    return $exception;
}

很高兴帮助你…加油。。。!else语句可能会被删除,因为如果“if”语句为false,它仍将转到函数的最后一次返回。这应该是可接受的答案,因为此答案有效,并且包含在正式的Laravel文档中。您可能还希望看到您可以在此链接上找到正确的信息