环境:Laravel 5.1,PHP 5.6.10
我尝试以JSON格式实现App\Exceptions\Handler::render()
响应错误消息。
app/Exceptions/Handler.php
如下:
// ignore..
public function render($request, Exception $e)
{
if ($e instanceof ModelNotFoundException) {
$e = new NotFoundHttpException($e->getMessage(), $e);
} elseif ($e instanceof AbstractException) {
return response()->apiJsonError(
$e->getMessage(),
$e->getErrors(),
$e->statusCode());
}
// ignore...
}
在控制器中,它也会引发异常:
if (ArrayUtil::isIndexExceed($list, $maxIndex)) {
// Index exceeds
throw new App\Exceptions\ExceedingIndexException;
}
但是,当发生错误时,不会调用Handler :: render()。响应是ExceedingIndexException
堆栈。
以下部分是异常类
我的自定义异常类ExceedingIndexException
:
namespace App\Exceptions;
use App\Http\Responses\Error;
use App\Exceptions\AbstractException;
class ExceedingIndexException extends AbstractException
{
public function __construct()
{
$message = 'Unable to execute';
$error = new Error('exceeding_index_value');
$statusCode = 400;
parent::__construct($statusCode, $error, $message);
}
}
ExceedingIndexException
类继承AbstractException
:
namespace App\Exceptions;
abstract class AbstractException extends \Exception
{
protected $statusCode;
protected $errors;
public function __construct(
$statusCode, $errors, $message, $code = 0, \Exception $previous = null) {
parent::__construct($message, $code, $previous);
$this->statusCode = $statusCode;
$this->errors = $errors;
}
public function getStatusCode()
{
return $this->statusCode;
}
public function getErrors()
{
return $this->errors;
}
}
解决方案
我发现我的项目依赖于RESTful API的Dingo API。因为,Dingo也支持并注册自己的异常处理程序,所以不会调用App\Exceptions\Handler
。
我尝试使用Custom Exception Responses in Dingo API作为我的异常处理程序来响应JSON格式的错误。它对我有用。
答案 0 :(得分:1)
实际上,您可以通过自定义错误处理程序替换Dingo API错误处理程序。获取https://github.com/KIVagant/api/blob/develop/src/Exception/Handler.php的副本 并将其保存到YourApp \ Exceptions \ Api \ V1 \ Handler.php。添加界面Dingo \ Api \ Contract \ Debug \ ExceptionHandler, 然后按照Exceptions now can return any additional data中的说明进行操作。
use Dingo\Api\Contract\Debug\ExceptionHandler as DingoExceptionHandler;
class Handler implements ExceptionHandler, DingoExceptionHandler {
替换错误处理程序,例如在boot()中。
// Resolve YourApp\Exceptions\Api\V1\Handler ifself
$this->app->alias('api.exception', 'YourApp\Exceptions\Api\V1\Handler');
$this->app->singleton('api.exception', function ($app) {
return new \YourApp\Exceptions\Api\V1\Handler($app['Illuminate\Contracts\Debug\ExceptionHandler'],
$app['config']['api.errorFormat'], $app['config']['api.debug']);
});
不要忘记设置错误格式。您可以在boot()中设置错误格式,例如:
// Set up error format
$this->app['api.exception']->setErrorFormat(...)
答案 1 :(得分:0)
确实,Dingo API接管了异常处理。
你遇到类似的问题,其中Lumen异常处理程序不处理任何事情,可能是一些包接管了处理。在这种情况下,它是Dingo API。
为Dingo API的例外注册自定义响应: https://github.com/dingo/api/wiki/Errors-And-Error-Responses#custom-exception-responses