Laravel 5 - API请求不存在的对象的全局异常处理程序

时间:2016-11-03 03:56:38

标签: php laravel

我使用的是Laravel 5.3。我有几个API,用户将请求特定的ID。 例如,url订阅事件
example.com/api/event/{id}/subscribe

通常如果id不存在,Laravel将返回响应500并显示错误消息"尝试获取非对象的属性"

所以我会在每个模型' id' id通过了:

$event = Event::find($id)
if ($event) {
    // return json data
}
else {
    return response()->json([
        'status' => 'object not found'
    ], 404);
}

我的问题是,是否有更好的解决方案来全局处理这个问题以检查所请求的对象是否不存在?我现在的解决方案就在这里,但我认为应该有更好的解决方案

我将此代码添加到我的app/Exception/Handler.php中,因此每个api请求不存在的对象都将返回带有特定json消息的404。因此API使用者将知道对象ID无效。

public function render($request, Exception $exception)
{
    // global exception handler if api request for non existing object id
    if ($request->wantsJson() && $exception->getMessage() == 'Trying to get property of non-object') {
        return response()->json([
            'status' => 'object requested not found'
        ], 404);
    }

    return parent::render($request, $exception);
}

提前致谢!

2 个答案:

答案 0 :(得分:7)

您可以使用App\Exceptions\Handlerpublic function render($request, Exception $exception) { if ($request->wantsJson() && $exception instanceof ModelNotFoundException) { return response()->json(['status' => 'object requested not found'], 404); } return parent::render($request, $exception); } 函数作为:

use Illuminate\Database\Eloquent\ModelNotFoundException;

请记住添加以下代码:

drivers.cars.forEach(                                
  car =>                                             
    car.name =                                       
      cars.find(                                     
        car2 =>                                      
          car2.brand_id === car.brand_id             
      )
        .models.find(                                
          model => 
            model.model_id === car.model_id
        ).name
)

Docs

答案 1 :(得分:3)

尝试更改

$event = Event::find($id)

$event = Event::findOrFail($id)

据我所知,如果找不到该ID的任何内容,它会抛出ModelNotFoundException。转到app/Exceptions/Handler.php并在render方法中,捕获异常并处理它。

编辑:

if ($e instanceof HttpResponseException) {
            return $e->getResponse();
        } elseif ($e instanceof ModelNotFoundException) {
            $e = new NotFoundHttpException($e->getMessage(), $e);
        } elseif ($e instanceof AuthenticationException) {
            return $this->unauthenticated($request, $e);
        } elseif ($e instanceof AuthorizationException) {
            $e = new HttpException(403, $e->getMessage());
        } elseif ($e instanceof ValidationException && $e->getResponse()) {
            return $e->getResponse();
        }

如果获得NotFoundHttpException异常,您可以看到父渲染方法触发ModelNotFoundException。我想你可以覆盖它以符合你的要求。