我正在尝试显示自定义错误页面而不是默认的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";
但我得到的结果相同:空白页
答案 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;
我花了永远来解决这个问题。
在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
我想:
我使用.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个错误页面。