我使用的是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);
}
提前致谢!
答案 0 :(得分:7)
您可以使用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);
}
函数作为:
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
)
答案 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
。我想你可以覆盖它以符合你的要求。