Я пытаюсь отобразить страницу пользовательских ошибок вместо сообщения Laravel 5 по умолчанию:
"Упс, похоже, что-то пошло не так"
- Красноречивый с вложенными
- SyntaxError: JSON.parse: неожиданный символ в строке 1 столбца 2 данных JSON - FireBug сообщает об этой ошибке. Любое решение?
- Использование инъекции зависимостей над ларавельными фасадами
- агрегирование mongodb php
- войти в wordpress
- Внедрение аутентификации пользователей и запросов
Я сделал много поиска, прежде чем публиковать здесь, я пробовал это решение, которое должно работать на Laravel 5, но ему не повезло: https://laracasts.com/discuss/channels/laravel/change-whoops-looks-like- что – то-пошли-неправильно-страница
Вот точный код, который у меня есть в файле 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";
Но я получаю тот же результат: пустая страница
Вместо ответа создайте маршрут для своей страницы ошибок в вашем Routes.php с именем «errors.defaultError». например
route::get('error', [ 'as' => 'errors.defaultError', 'uses' => 'ErrorController@defaultError' ]);
Либо создайте контроллер, либо включите функцию в маршрут с помощью
return view('errors.defaultError');
и вместо этого используйте перенаправление. Например
public function render($request, Exception $e) { return redirect()->route('errors.defaultError'); }
Я полностью согласен со всеми, кто хочет настроить ошибки в Laravel, чтобы их пользователи никогда не видели смущающего сообщения, такого как «Упс, похоже, что что-то пошло не так».
Мне потребовалось время, чтобы понять это.
В 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/error500
и посмотрю, видите ли вы свою настроенную страницу ошибок.
Затем также перейдите на mysite.com/some-nonexistent-route
и посмотрите, все ли у вас есть страница 404, которую вы настроили, если у вас ее есть.
В laravel 5.4 вы можете поместить этот блок кода внутри функции рендеринга в Handler.php – найти в приложении / исключениях / 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);
Типичный способ сделать это – просто создать отдельные представления для каждого типа ошибки .
Мне нужна динамическая страница пользовательских ошибок (поэтому все ошибки попадают в один и тот же шаблон клипа).
В 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); }
Тогда мне не нужно создавать 20 страниц ошибок для каждого возможного кода состояния ошибки HTTP.
У меня две страницы ошибок – 404.blade.php & generic.blade.php
Я хотел:
Я использую .env – APP_DEBUG, чтобы решить это.
Я обновил метод рендеринга в обработчике исключений:
приложение / исключения / 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); }
на Larvel 5.2 на вашем app/exceptions/handler.php
просто расширьте этот метод 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); } }