繁体   English   中英

如何为“模型没有查询结果”返回自定义 API 响应,Laravel

[英]How to return custom API response for "No query results for model", Laravel

我正在 Laravel 5.2 中构建一个 RESTful API。

在我的资源控制器中,我想使用隐式模型绑定来显示资源。 例如

public function show(User $users)
{
    return $this->respond($this->userTransformer->transform($users));
}

当请求一个不存在的资源时 Laravel 会自动返回 NotFoundHttpException

NotFoundHttp异常

我想返回我自己的自定义响应,但是如何为使用路由模型绑定完成的查询执行此操作?

可以实现像这个Dingo API 响应答案这样的东西吗?

或者我会坚持使用我的旧代码,它是这样的:

public function show($id)
{
    $user = User::find($id);

    if ( ! $user ) {
        return $this->respondNotFound('User does not exist');
    }

    return $this->respond($this->userTransformer->transform($users));
}

因此,我可以查看是否未找到资源(用户)并返回适当的响应。

看看您是否可以改为捕获ModelNotFound

public function render($request, Exception $e)
{
    if ($e instanceof \Illuminate\Database\Eloquent\ModelNotFoundException) {
        dd('model not found');
    }

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

我认为/app/Exceptions下的Handler.php文件是个好地方

public function render($request, Exception $e)
{
    if ($e instanceof NotFoundHttpException) {
        // return your custom response
    }

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

在 Laravel 7 和 8 中你可以做这样的事情。

在 app/Exception/Handler.php 类中,添加如下所示的 render() 方法(如果它不存在)。

请注意,您应该使用Throwable而不是类型提示Exception类。

use Throwable;

public function render($request, Throwable $e)
{
    if ($e instanceof \Illuminate\Database\Eloquent\ModelNotFoundException) {
        //For API (json)
        if (request()->wantsJson()) {
            return response()->json([
                'message' => 'Record Not Found !!!'
            ], 404);
        }

        //Normal 
        return view('PATH TO YOUR ERROR PAGE'); 
    }

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM