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

xmh*_*fiz 3 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);
}
Run Code Online (Sandbox Code Playgroud)

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

我将此代码添加到我的代码中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);
}
Run Code Online (Sandbox Code Playgroud)

提前致谢!

Ami*_*pta 7

您可以使用类的render()功能App\Exceptions\Handler:

public 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);
}
Run Code Online (Sandbox Code Playgroud)

并记得添加以下代码:

use Illuminate\Database\Eloquent\ModelNotFoundException;
Run Code Online (Sandbox Code Playgroud)

文件