Laravel 5上未显示自定义错误页面

时间:2015-06-02 20:00:46

标签: php laravel error-handling

我正在尝试显示自定义错误页面而不是默认的Laravel 5消息:

  

“糟糕......看起来出了问题”

我在发布之前做了很多搜索,我尝试了这个解决方案,它应该适用于Laravel 5,但没有运气:https://laracasts.com/discuss/channels/laravel/change-whoops-looks-like-something-went-wrong-page

以下是我在app/Exceptions/Handler.php文件中的确切代码:

<?php namespace App\Exceptions;

use Exception;
use View;
use Bugsnag\BugsnagLaravel\BugsnagExceptionHandler as ExceptionHandler;

class Handler extends ExceptionHandler {

    protected $dontReport = [
        'Symfony\Component\HttpKernel\Exception\HttpException'
    ];

    public function report(Exception $e)
    {
        return parent::report($e);
    }

    public function render($request, Exception $e)
    {
        return response()->view('errors.defaultError');
    }

}

但是,不是显示我的自定义视图,而是显示空白页面。我也尝试在render()函数

中使用此代码
return "Hello, I am an error message";

但我得到的结果相同:空白页

6 个答案:

答案 0 :(得分:4)

而不是响应在Routes.php中为您的错误页面创建路径,名称为“errors.defaultError”。例如

function foo(args) {
    var instance = Object.create(HB.hideShowFacilites.Selectors.prototype);
    HB.hideShowFacilites.Selectors.apply(instance, args);
    return instance;
}

var one = foo([".facilities .more-centered", "more-centered", "less-centered", "container-max-height", ".facilities .container-min-height"]);  

使用

创建控制器或在路径中包含该功能
route::get('error', [
    'as' => 'errors.defaultError',
    'uses' => 'ErrorController@defaultError' ]);

并改为使用重定向。例如

return view('errors.defaultError');

答案 1 :(得分:2)

我非常同意每个想要在Laravel中自定义错误体验的人,以便他们的用户永远不会看到诸如“哎呀”之类的令人尴尬的消息,看起来出了问题。&#39;

我花了永远来解决这个问题。

如何自定义&#34;哎呀&#34; Laravel 5.3中的消息

app/Exceptions/Handler.php中,将整个prepareResponse函数替换为以下函数:

protected function prepareResponse($request, Exception $e)
{        
    if ($this->isHttpException($e)) {            
        return $this->toIlluminateResponse($this->renderHttpException($e), $e);
    } else {
        return response()->view("errors.500", ['exception' => $e]); //By overriding this function, I make Laravel display my custom 500 error page instead of the 'Whoops, looks like something went wrong.' message in Symfony\Component\Debug\ExceptionHandler
    }
}

基本上,它与原始功能几乎完全相同,但您只需更改else块即可呈现视图。

/resources/views/errors中,创建500.blade.php

你可以在那里写下你想要的任何文本,但我总是建议保持错误页面非常基本(纯HTML和CSS并没有什么特别之处),这样他们自己几乎没有机会导致进一步的错误。

测试它是否正常工作

routes/web.php中,您可以添加:

Route::get('error500', function () {
    throw new \Exception('TEST PAGE. This simulated error exception allows testing of the 500 error page.');
});

然后我会浏览到mysite.com/error500并查看您是否看到自定义的错误页面。

然后还浏览到mysite.com/some-nonexistent-route并查看您是否仍然获得了已设置的404页面,假设您有一个页面。

答案 2 :(得分:1)

app/exceptions/handler.php上的Larvel 5.2上的

只是扩展此方法renderHttpException,即将此方法添加到handler.php根据需要进行自定义

/**
 * Render the given HttpException.
 *
 * @param  \Symfony\Component\HttpKernel\Exception\HttpException  $e
 * @return \Symfony\Component\HttpFoundation\Response
 */
protected function renderHttpException(HttpException $e)
{

   // to get status code ie 404,503
    $status = $e->getStatusCode();

    if (view()->exists("errors.{$status}")) {
        return response()->view("errors.{$status}", ['exception' => $e], $status, $e->getHeaders());
    } else {
        return $this->convertExceptionToResponse($e);
    }
}

答案 3 :(得分:1)

在laravel 5.4中,您可以将此代码块放在Handler.php中的 render 函数中 - 在app / exceptions / Handler.php中找到

  //Handle TokenMismatch Error/session('csrf_error')
    if ($exception instanceof TokenMismatchException) {
        return response()->view('auth.login', ['message' => 'any custom message'] );
    }

    if ($this->isHttpException($exception)){       
        if($exception instanceof NotFoundHttpException){
            return response()->view("errors.404");
        }
        return $this->renderHttpException($exception);
    }

    return response()->view("errors.500");
    //return parent::render($request, $exception);

答案 4 :(得分:0)

我有两个错误页面 - 404.blade.php&amp; generic.blade.php

我想:

  • 显示所有缺失页面的404页面
  • 开发中的例外的例外页面
  • 生产中例外的一般错误页面

我使用.env - APP_DEBUG来决定这一点。

我更新了异常处理程序中的render方法:

应用/异常/ Handler.php

public function render($request, Exception $e)
{
    if ($e instanceof ModelNotFoundException) {
        $e = new NotFoundHttpException($e->getMessage(), $e);
    }

    if ($this->isUnauthorizedException($e)) {
        $e = new HttpException(403, $e->getMessage());
    }

    if ($this->isHttpException($e)) {
        // Show error for status code, if it exists
        $status = $e->getStatusCode();
        if (view()->exists("errors.{$status}")) {
            return response()->view("errors.{$status}", ['exception' => $e], $status);
        }
    }

    if (env('APP_DEBUG')) {
        // In development show exception
        return $this->toIlluminateResponse($this->convertExceptionToResponse($e), $e);
    }
    // Otherwise show generic error page
    return $this->toIlluminateResponse(response()->view("errors.generic"), $e);

}

答案 5 :(得分:-1)

执行此操作的典型方法是create individual views for each error type

我想要一个动态自定义错误页面(因此所有错误都会遇到相同的刀片模板)。

在Handler.php中我用过:

public function render($request, Exception $e)
{
    // Get error status code.
    $statusCode = method_exists($e, 'getStatusCode') ? $e->getStatusCode() : 400;
    $data = ['customvar'=>'myval'];
    return response()->view('errors.index', $data, $statusCode);
}

然后,我不必为每个可能的http错误状态代码创建20个错误页面。