使用资源将数组作为对象返回

Array is returned as an object using resource

发生了一些奇怪的事情。

我得到了这样的数组:

=> [
     "optionalinformation" => [
       "domain" => [
         "type" => "string",
       ],
     ],
   ]

这个数组被一个资源使用,如果我使用 tinker 像这样检查这个资源:

$result = App\Http\Resources\ProductResource::make(Product::find(2));

is_array($result->optionalinformation);

在这种情况下,结果是 true:这是一个数组。

但是如果 axios 获取结果,我得到这个:

"optionalinformation": {
      "domain": {
        "type": "string"
      },

它不再是一个数组而是一个对象。知道为什么会这样吗?

这是我的 api-资源:

 /**
     * Transform the resource into an array.
     *
     * @param \Illuminate\Http\Request $request
     *
     * @return array
     */
    public function toArray($request)
    {
        return [
            'id'                      => $this->id,
            'title'                   => $this->title,
            'optionalinformation'     => $this->optionalinformation,
        ];
    }

这里有点混乱,主要是 PHP 行话造成的。

在PHP 行话中,关联数组仍然是数组。但是关联数组实际上是一个字典。

其他编程语言不将关联数组(字典)视为数组,因此具有不同的词汇表。

你的数据结构实际上是一个字典,而不是一个数字索引数组。

从 JSON 的角度来看,如果您的数据结构具有非数字键,那么它会被转换为一个对象。

您的困惑源于以下事实:如果变量是从零开始的索引数组,is_array 将 return 为真,而实际上对于关联数组也是 return 为真。

在定义中。 Laravel's resource classes allow you to expressively and easily transform your models and model collections into JSON. 检查 Resource docs

如果您期望 return 中的数组,那么我建议跳过资源并使用 ->toArray() 直接从控制器传递数据。但是话又说回来,你在你的 vuejs 中使用 axios 那么我强烈建议坚持使用 json 格式作为预期的响应。