是否需要使用 json 函数显式返回所有 API 响应?

Do all API responses need to explicitly be returned with a json function?

我正在进入 api controllers 并且想知道这个 index function:

public function index()
{
    $data = DB::table('galleries')->get();
    return response()->json($data);
}

在我的 api controller 中必须用 response()->json() 编辑 return 或者如果只 return 变量是可以的:

public function index()
{
    $data = DB::table('galleries')->get();
    return $data;
}

两者似乎都有效。有理由使用前者吗?

两者似乎都是正确的,但如果您以 json 的形式发送,它将是正式的并且在 fornt-end 网站上他们可以轻松使用

return $data 只会将 $data 转换为 json 响应。不会设置 header 并且您的前端不会将其识别为 json object.

return response() 将 return 一个完整的 Response 实例。来自文档

Returning a full Response instance allows you to customize the response's HTTP status code and headers. A Response instance inherits from the Symfony\Component\HttpFoundation\Response class, which provides a variety of methods for building HTTP responses

对于return response()->json()方法

The json method will automatically set the Content-Type header to application/json, as well as convert the given array to JSON using the json_encode PHP function

所以这将在您的前端被识别为 json object。在 laravel doc.

阅读更多内容

当您作为响应发送的内容还不是 Response 的实例时,Laravel 将创建一个 Response 的新实例,并将其作为内容。当发送响应并且 object 是一个数组(或可排列的)或可转换为 JSON 的东西时,它会作为 JSON 响应发送。到那时所有相关的 headers 都是正确的。

如果您对它的工作原理感到好奇,可以考虑源代码的两个部分:

  1. The part that checks whether the response is already an instance of Response and constructs one if not
  2. The part that decides whether a response content should be JSON

如果你想要我的意见,那么你应该做 response()->json(...) 来创建一个 JsonResponse 实例,它不可能是模棱两可的,否则你将依赖可能会发生变化的未记录的行为。