Skip to content
This repository was archived by the owner on Feb 14, 2023. It is now read-only.

Commit e255252

Browse files
author
Andrey Helldar
committed
Added abstract exception for Laravel and Lumen
1 parent 4c73f72 commit e255252

File tree

2 files changed

+125
-85
lines changed

2 files changed

+125
-85
lines changed

README.md

Lines changed: 23 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -574,103 +574,41 @@ return with code 405:
574574

575575
### Best practice use with the Laravel and Lumen Frameworks
576576

577-
To call the function when errors occur, you need to make changes to file `app/Exceptions/Handler.php`:
578-
577+
If you use the Laravel or Lumen framework, you can update the inheritance in the `app\Exceptions\Handler.php` file to `Helldar\ApiResponse\Support\LaravelException`:
579578
```php
580-
use Illuminate\Auth\AuthenticationException;
581-
use Illuminate\Contracts\Support\Responsable;
582-
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
583-
use Illuminate\Foundation\Http\Exceptions\MaintenanceModeException;
584-
use Illuminate\Http\Exceptions\HttpResponseException;
585-
use Illuminate\Routing\Router;
586-
use Illuminate\Support\Arr;
587-
use Illuminate\Validation\ValidationException;
588-
use Symfony\Component\HttpFoundation\JsonResponse;
589-
use Throwable;
579+
use Helldar\ApiResponse\Support\LaravelException as ExceptionHandler;
590580

591581
class Handler extends ExceptionHandler
592582
{
593-
/**
594-
* Render an exception into an HTTP response.
595-
*
596-
* @param \Illuminate\Http\Request $request
597-
* @param \Throwable $e
598-
*
599-
* @return \Symfony\Component\HttpFoundation\Response
600-
*
601-
* @throws \Throwable
602-
*/
603-
public function render($request, Throwable $e)
604-
{
605-
if ($this->isJson($request) && $e instanceof MaintenanceModeException) {
606-
return api_response(__('Maintenance Mode'), 503);
607-
}
608-
609-
if (\method_exists($e, 'render') && $response = $e->render($request)) {
610-
return Router::toResponse($request, $response);
611-
} elseif ($e instanceof Responsable) {
612-
return $e->toResponse($request);
613-
}
614-
615-
$e = $this->prepareException($e);
616-
617-
if ($e instanceof HttpResponseException) {
618-
return $e->getResponse();
619-
} elseif ($e instanceof AuthenticationException) {
620-
return $this->unauthenticated($request, $e);
621-
} elseif ($e instanceof ValidationException) {
622-
return $this->convertValidationExceptionToResponse($e, $request);
623-
}
624-
625-
return $this->isJson($request)
626-
? $this->prepareJsonResponse($request, $e)
627-
: $this->prepareResponse($request, $e);
628-
}
629-
630-
protected function invalidJson($request, ValidationException $exception)
631-
{
632-
return api_response($exception);
633-
}
583+
//
584+
}
585+
```
634586

635-
protected function unauthenticated($request, AuthenticationException $exception)
636-
{
637-
return $this->isJson($request)
638-
? api_response($exception)
639-
: redirect()->guest(route('login'));
640-
}
587+
If you did not add anything to this file, then delete everything except methods 111 and 222 from it.
641588

642-
/**
643-
* @param \Illuminate\Http\Request $request
644-
* @param Throwable|Symfony\Component\HttpFoundation\JsonResponse $response
645-
*
646-
* @return bool
647-
*/
648-
protected function isJson($request, $response = null): bool
649-
{
650-
return $request->expectsJson() || $request->isJson() || $request->is('api*') || $response instanceof JsonResponse;
651-
}
589+
As a result, a clean file will look like this:
590+
```php
591+
<?php
652592

653-
protected function prepareJsonResponse($request, Throwable $e)
654-
{
655-
return api_response(
656-
$this->convertExceptionToArray($e),
657-
$this->isHttpException($e) ? $e->getStatusCode() : 500,
658-
[],
659-
$this->isHttpException($e) ? $e->getHeaders() : []
660-
);
661-
}
593+
namespace App\Exceptions;
662594

663-
protected function convertExceptionToArray(Throwable $e)
664-
{
665-
$converted = parent::convertExceptionToArray($e);
595+
use Helldar\ApiResponse\Support\LaravelException as ExceptionHandler;
666596

667-
return config('app.debug')
668-
? $converted
669-
: Arr::get($converted, 'message');
670-
}
597+
class Handler extends ExceptionHandler
598+
{
599+
protected $dontReport = [
600+
//
601+
];
602+
603+
protected $dontFlash = [
604+
'password',
605+
'password_confirmation',
606+
];
671607
}
672608
```
673609

610+
Or you can change this file by adding code to it, similar to [ours](src/Support/LaravelException.php).
611+
674612
[[ to top ]](#api-response)
675613

676614

src/Support/LaravelException.php

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
<?php
2+
3+
namespace Helldar\ApiResponse\Support;
4+
5+
use Illuminate\Auth\AuthenticationException;
6+
use Illuminate\Contracts\Support\Responsable;
7+
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
8+
use Illuminate\Foundation\Http\Exceptions\MaintenanceModeException;
9+
use Illuminate\Http\Exceptions\HttpResponseException;
10+
use Illuminate\Routing\Router;
11+
use Illuminate\Support\Arr;
12+
use Illuminate\Validation\ValidationException;
13+
use Symfony\Component\HttpFoundation\JsonResponse;
14+
use Throwable;
15+
16+
use function __;
17+
use function api_response;
18+
use function config;
19+
use function method_exists;
20+
use function redirect;
21+
22+
abstract class LaravelException extends ExceptionHandler
23+
{
24+
/**
25+
* Render an exception into an HTTP response.
26+
*
27+
* @param \Illuminate\Http\Request $request
28+
* @param \Throwable $e
29+
*
30+
* @throws \Throwable
31+
* @return \Symfony\Component\HttpFoundation\Response
32+
*
33+
*/
34+
public function render($request, Throwable $e)
35+
{
36+
if ($this->isJson($request) && $e instanceof MaintenanceModeException) {
37+
return api_response(__('Maintenance Mode'), 503);
38+
}
39+
40+
if (method_exists($e, 'render') && $response = $e->render($request)) {
41+
return Router::toResponse($request, $response);
42+
} elseif ($e instanceof Responsable) {
43+
return $e->toResponse($request);
44+
}
45+
46+
$e = $this->prepareException($e);
47+
48+
if ($e instanceof HttpResponseException) {
49+
return $e->getResponse();
50+
} elseif ($e instanceof AuthenticationException) {
51+
return $this->unauthenticated($request, $e);
52+
} elseif ($e instanceof ValidationException) {
53+
return $this->convertValidationExceptionToResponse($e, $request);
54+
}
55+
56+
return $this->isJson($request)
57+
? $this->prepareJsonResponse($request, $e)
58+
: $this->prepareResponse($request, $e);
59+
}
60+
61+
protected function invalidJson($request, ValidationException $exception)
62+
{
63+
return api_response($exception);
64+
}
65+
66+
protected function unauthenticated($request, AuthenticationException $exception)
67+
{
68+
return $this->isJson($request)
69+
? api_response($exception)
70+
: redirect()->guest(route('login'));
71+
}
72+
73+
/**
74+
* @param \Illuminate\Http\Request $request
75+
* @param Throwable|Symfony\Component\HttpFoundation\JsonResponse $response
76+
*
77+
* @return bool
78+
*/
79+
protected function isJson($request, $response = null): bool
80+
{
81+
return $request->expectsJson() || $request->isJson() || $request->is('api*') || $response instanceof JsonResponse;
82+
}
83+
84+
protected function prepareJsonResponse($request, Throwable $e)
85+
{
86+
return api_response(
87+
$this->convertExceptionToArray($e),
88+
$this->isHttpException($e) ? $e->getStatusCode() : 500,
89+
[],
90+
$this->isHttpException($e) ? $e->getHeaders() : []
91+
);
92+
}
93+
94+
protected function convertExceptionToArray(Throwable $e)
95+
{
96+
$converted = parent::convertExceptionToArray($e);
97+
98+
return config('app.debug')
99+
? $converted
100+
: Arr::get($converted, 'message');
101+
}
102+
}

0 commit comments

Comments
 (0)