Comments (7)
It is indeed the Dingo Exception Handler I have edited the handle function in the Dingo/Api/Exception/Handler it acts as temporary solution
`
public function handle(Exception $exception)
{foreach ($this->handlers as $hint => $handler) { if (! $exception instanceof $hint) { continue; } if ($response = $handler($exception)) { if (! $response instanceof BaseResponse) { $response = new Response($response, $this->getExceptionStatusCode($exception)); } return $response; } } if($exception instanceof ValidationException) { return $exception->getResponse(); } return $this->genericResponse($exception); }
`
from lumen-jwt.
Investigating this issue. I doubt it caused by Dingo Exception Handler.
from lumen-jwt.
@MaeseppTarvo Here is the whole file, check the use
part on the top of the file because I used a class to fix it besides @elbakly addition
namespace Dingo\Api\Exception;
use Exception;
use ReflectionFunction;
use Illuminate\Http\Response;
use Dingo\Api\Contract\Debug\ExceptionHandler;
use Illuminate\Validation\ValidationException;
use Dingo\Api\Contract\Debug\MessageBagErrors;
use Symfony\Component\HttpFoundation\Response as BaseResponse;
use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface;
use Illuminate\Contracts\Debug\ExceptionHandler as IlluminateExceptionHandler;
class Handler implements ExceptionHandler, IlluminateExceptionHandler
{
/**
* Array of exception handlers.
*
* @var array
*/
protected $handlers = [];
/**
* Generic response format.
*
* @var array
*/
protected $format;
/**
* Indicates if we are in debug mode.
*
* @var bool
*/
protected $debug = false;
/**
* User defined replacements to merge with defaults.
*
* @var array
*/
protected $replacements = [];
/**
* The parent Illuminate exception handler instance.
*
* @var \Illuminate\Contracts\Debug\ExceptionHandler
*/
protected $parentHandler;
/**
* Create a new exception handler instance.
*
* @param \Illuminate\Contracts\Debug\ExceptionHandler $parentHandler
* @param array $format
* @param bool $debug
*
* @return void
*/
public function __construct(IlluminateExceptionHandler $parentHandler, array $format, $debug)
{
$this->parentHandler = $parentHandler;
$this->format = $format;
$this->debug = $debug;
}
/**
* Report or log an exception.
*
* @param \Exception $exception
*
* @return void
*/
public function report(Exception $exception)
{
$this->parentHandler->report($exception);
}
/**
* Render an exception into an HTTP response.
*
* @param \Dingo\Api\Http\Request $request
* @param \Exception $exception
*
* @throws \Exception
*
* @return mixed
*/
public function render($request, Exception $exception)
{
return $this->handle($exception);
}
/**
* Render an exception to the console.
*
* @param \Symfony\Component\Console\Output\OutputInterface $output
* @param \Exception $exception
*
* @return mixed
*/
public function renderForConsole($output, Exception $exception)
{
return $this->parentHandler->renderForConsole($output, $exception);
}
/**
* Register a new exception handler.
*
* @param callable $callback
*
* @return void
*/
public function register(callable $callback)
{
$hint = $this->handlerHint($callback);
$this->handlers[$hint] = $callback;
}
/**
* Handle an exception if it has an existing handler.
*
* @param \Exception $exception
*
* @return \Illuminate\Http\Response
*/
public function handle(Exception $exception)
{
foreach ($this->handlers as $hint => $handler) {
if (! $exception instanceof $hint) {
continue;
}
if ($response = $handler($exception)) {
if (! $response instanceof BaseResponse) {
$response = new Response($response, $this->getExceptionStatusCode($exception));
}
return $response;
}
}
if ($exception instanceof ValidationException) {
return $exception->getResponse();
}
return $this->genericResponse($exception);
}
/**
* Handle a generic error response if there is no handler available.
*
* @param \Exception $exception
*
* @throws \Exception
*
* @return \Illuminate\Http\Response
*/
protected function genericResponse(Exception $exception)
{
$replacements = $this->prepareReplacements($exception);
$response = $this->newResponseArray();
array_walk_recursive($response, function (&$value, $key) use ($exception, $replacements) {
if (starts_with($value, ':') && isset($replacements[$value])) {
$value = $replacements[$value];
}
});
$response = $this->recursivelyRemoveEmptyReplacements($response);
return new Response($response, $this->getStatusCode($exception), $this->getHeaders($exception));
}
/**
* Get the status code from the exception.
*
* @param \Exception $exception
*
* @return int
*/
protected function getStatusCode(Exception $exception)
{
return $exception instanceof HttpExceptionInterface ? $exception->getStatusCode() : 500;
}
/**
* Get the headers from the exception.
*
* @param \Exception $exception
*
* @return array
*/
protected function getHeaders(Exception $exception)
{
return $exception instanceof HttpExceptionInterface ? $exception->getHeaders() : [];
}
/**
* Prepare the replacements array by gathering the keys and values.
*
* @param \Exception $exception
*
* @return array
*/
protected function prepareReplacements(Exception $exception)
{
$statusCode = $this->getStatusCode($exception);
if (! $message = $exception->getMessage()) {
$message = sprintf('%d %s', $statusCode, Response::$statusTexts[$statusCode]);
}
$replacements = [
':message' => $message,
':status_code' => $statusCode,
];
if ($exception instanceof MessageBagErrors && $exception->hasErrors()) {
$replacements[':errors'] = $exception->getErrors();
}
if ($code = $exception->getCode()) {
$replacements[':code'] = $code;
}
if ($this->runningInDebugMode()) {
$replacements[':debug'] = [
'line' => $exception->getLine(),
'file' => $exception->getFile(),
'class' => get_class($exception),
'trace' => explode("\n", $exception->getTraceAsString()),
];
}
return array_merge($replacements, $this->replacements);
}
/**
* Set user defined replacements.
*
* @param array $replacements
*
* @return void
*/
public function setReplacements(array $replacements)
{
$this->replacements = $replacements;
}
/**
* Recursirvely remove any empty replacement values in the response array.
*
* @param array $input
*
* @return array
*/
protected function recursivelyRemoveEmptyReplacements(array $input)
{
foreach ($input as &$value) {
if (is_array($value)) {
$value = $this->recursivelyRemoveEmptyReplacements($value);
}
}
return array_filter($input, function ($value) {
if (is_string($value)) {
return ! starts_with($value, ':');
}
return true;
});
}
/**
* Create a new response array with replacement values.
*
* @return array
*/
protected function newResponseArray()
{
return $this->format;
}
/**
* Get the exception status code.
*
* @param \Exception $exception
* @param int $defaultStatusCode
*
* @return int
*/
protected function getExceptionStatusCode(Exception $exception, $defaultStatusCode = 500)
{
return ($exception instanceof HttpExceptionInterface) ? $exception->getStatusCode() : $defaultStatusCode;
}
/**
* Determines if we are running in debug mode.
*
* @return bool
*/
protected function runningInDebugMode()
{
return $this->debug;
}
/**
* Get the hint for an exception handler.
*
* @param callable $callback
*
* @return string
*/
protected function handlerHint(callable $callback)
{
$reflection = new ReflectionFunction($callback);
$exception = $reflection->getParameters()[0];
return $exception->getClass()->getName();
}
/**
* Get the exception handlers.
*
* @return array
*/
public function getHandlers()
{
return $this->handlers;
}
/**
* Set the error format array.
*
* @param array $format
*
* @return void
*/
public function setErrorFormat(array $format)
{
$this->format = $format;
}
/**
* Set the debug mode.
*
* @param bool $debug
*
* @return void
*/
public function setDebug($debug)
{
$this->debug = $debug;
}
}
from lumen-jwt.
Wow, thanks @elbakly! I will make a patch for this. Should check for another exception.
from lumen-jwt.
@elbakly This is not fixing the problem. The output is still the same.
from lumen-jwt.
@elbakly Yayy. That was it, I was missing the use Illuminate\Validation\ValidationException;
from lumen-jwt.
Is this still an issue?
from lumen-jwt.
Related Issues (20)
- Class session.store does not exist HOT 1
- Invalidate and refresh routes both giving internal 500 HOT 1
- [PHP 5.6] Getting 'invalid_credentials' on production, while it works on local machine. HOT 17
- php artisan migrate throws error HOT 2
- Error 401 HOT 7
- Command route:list is empty HOT 1
- How to refresh token? HOT 11
- Check current authenticated user
- Not able to run php artisan serve HOT 1
- Refresh is being guarded by a token check, returns "invalid. HOT 2
- Where is the hashing service being bound? HOT 6
- Lumen 5.5 HOT 2
- Sometimes api returns "Oops something went wrong" HTTP Code 500 HOT 2
- Heroku
- ErrorException array_values() expects parameter 1 to be array, string given HOT 1
- Lumen 5.6
- Why use login? and not just /auth
- Swagger install
- How can I update password field?
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from lumen-jwt.