我正在尝试将给定的 API 响应转换为易于使用的东西。
这是我到目前为止所拥有的:
控制器:
public function drive()
{
$optParams = [
'corpora' => 'drive',
'driveId' => env('GOOGLE_DRIVE_ID'),
'includeItemsFromAllDrives' => true,
'supportsAllDrives' => true,
'fields' => 'files(*)'
];
$results = $this->googleDrive->files->listFiles($optParams);
$data = collect($results);
$collection = new FileCollection($data);
dd($collection);
return 'Hi!';
}
文件收集资源:
public function toArray($request)
{
return [
'data' => $this->collection,
'meta' => ['files_count' => $this->collection->count()],
];
}
文件资源:
public function toArray($request)
{
return [
'name' => $this->resource['name'],
'mime' => $this->resource['mimeType'],
'parents' => $this->resource['parents'],
'version' => $this->resource['version'],
'webDownloadLink' => $this->resource['webContentLink'],
'webLink' => $this->resource['webViewLink'],
'modified_at' => $this->resource['modifiedTime'],
'size' => $this->resource['size']
];
}
这是我得到的结果:
FileCollection {#223 ▼
+collects: null
+collection: Collection {#243 ▶}
+resource: Collection {#243 ▼
#items: array:2 [▼
0 => File {#224 ▼
+resource: Google_Service_Drive_DriveFile {#279 ▶}
+with: []
+additional: []
}
1 => File {#263 ▼
+resource: Google_Service_Drive_DriveFile {#269 ▶}
+with: []
+additional: []
}
]
}
+with: []
+additional: []
}
因此,您可以看到资源类型是正确的,但由于某种原因,FileCollection 中的“元”不存在,File资源中的字段也不存在。仍然显示所有字段,例如 30+(而不是 FileResource 中请求的 8 个)。
我在这里错过了什么吗?
编辑:
当使用 toArray() 方法 ( $collection->toArray(null)
) 访问集合时,我确实得到了适当的结果:
array:2 [▼
"data" => Collection {#243 ▼
#items: array:2 [▼
0 => File {#224 ▶}
1 => File {#263 ▶}
]
}
"meta" => array:1 [▼
"files_count" => 2
]
]
那么我现在如何确保这个集合使用 FileResources 的 toArray() 呢?(我仍然得到超过 30 个字段,而不是 8 个)。
PS:我真的不明白为什么我需要调用 toArray(),在他们的文档中没有任何地方写:https ://laravel.com/docs/5.8/eloquent-resources 。