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

时间:2016-02-17 21:42:10

标签: php laravel laravel-5.2

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

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

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

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

NotFoundHttpException

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

这样的Dingo API response answer能够实现吗?

或者我会坚持使用类似这样的旧代码:

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

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

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

所以我可以看到是否找不到资源(用户)并返回适当的响应。

3 个答案:

答案 0 :(得分:2)

看看你是否可以抓住ModelNotFound

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

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

答案 1 :(得分:0)

我认为一个好地方会出现在Handler.php

下的/app/Exceptions文件中
public function render($request, Exception $e)
{
    if ($e instanceof NotFoundHttpException) {
        // return your custom response
    }

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

答案 2 :(得分:0)

在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);
}