Laravel api类异常处理

Posted

技术标签:

【中文标题】Laravel api类异常处理【英文标题】:Laravel api class exception handling 【发布时间】:2015-02-18 09:53:36 【问题描述】:

我有一个 Laravel 4.2 应用程序,路径如下:

Route::group(['prefix' => 'api/v1'], function()

    Route::resource('service_logs', 'ServiceLogsController', [
        'only' => ['index', 'store', 'show']
    ]);
);

ServiceLogsController 控制器从ApiController 扩展而来,看起来像这样缩减版

class ApiController extends \BaseController 

    protected $statusCode = 200;

    public function getStatusCode()
    
        return $this->statusCode;
    

    public function setStatusCode($statusCode)
    
        $this->statusCode = $statusCode;

        return $this;
    

    public function respondInternalError($message = 'Internal Error!')
    
        return $this->setStatusCode(500)->respondWithError($message);
    

    public function respondWithError($message)
    
        return Response::json([
            'error' => [
                'message' => $message,
                'status_code' => $this->getStatusCode()
            ]
        ], $this->getStatusCode());
    

    // ...


我想做的是,当发生未捕获的异常时,我想在我的 ApiController 上调用 respondInternalError() 方法,以便 API 使用者有一致的响应,而不是什么都没有或 html whoops 错误。

为此,我尝试在我的app/start/global.php 中添加以下代码

App::error(function(Exception $exception, $code)

    Log::error($exception);

    if (Request::is('api/*'))
    
        App::make('ApiController')->respondInternalError('Uncaught api exception error occurred - ' . $exception->getMessage());
    
);

为了测试它,我尝试向以下网址发出 POST 请求:/api/v1/service_logs/123。

这不起作用,因为该 URL 是一个 GET url,所以 Laravel 会抛出正确的 method not allowed exception。但是,它并没有被抓住。

知道如何为每个控制器类实现一个捕获所有异常处理程序吗?


更新 稍微改进了工作“全局”api异常处理程序

App::error(function(Exception $exception, $code)

    Log::error($exception);

    if (Request::is('api/*'))
    
        $errorName = Symfony\Component\HttpFoundation\Response::$statusTexts[$code];

        return App::make('ApiController')
            ->setStatusCode($code)
            ->respondWithError($errorName . ' error has occurred.');
    
);

发生错误时,您现在可以得到这个(在 Chrome + Postman 中完成测试):

【问题讨论】:

以静态方式调用 Request::is() 在我的设置中返回异常... 我尝试直接调用App::make('ApiController')->respondInternalError() 而不检查请求以查看我的方法是否至少被调用,但不是。 对于 Laravel 5 中的用户,这可能会帮助您完成这项工作。 ***.com/questions/26630985/… 【参考方案1】:

解决方案其实非常非常简单。你只需要返回你的控制器函数的返回值

if (Request::is('api/*'))

    return App::make('ApiController')->respondInternalError('Uncaught api exception error occurred - ' . $exception->getMessage());

【讨论】:

以上是关于Laravel api类异常处理的主要内容,如果未能解决你的问题,请参考以下文章

laravel5.6 laravel 接口 接管 自定义异常类

重写Laravel异常处理类

laravel异常处理

SpringBoot 为API添加统一的异常处理

laravel5异常及时通知

在 laravel 中处理异常而不在异常处理程序的渲染方法中进行类型检查异常并且不定义自定义异常?