公式ドキュメント
やりたいこと
API ResourceのCollectionで特定Resourceでパスワードなど不要な情報やEnumを文字列変換したデータを取得したい。
公式にはやり方が記載されていなかったので、実装例を残しておきます。
Collectionの取得したいデータイメージ
{
"data": [
{
"id": 1,
"name": "佐々木",
"status": "本登録",
},
{
"id": 2,
"name": "嘉納",
"status": "退会",
},
{
"id": 3,
"name": "亜門",
"status": "仮登録",
},
],
"count": 3,
"statuses": {"1": "仮登録", "2": "本登録", "3": "退会"}
}
サンプルコード
Collectionクラス
実装する時のポイント
デフォルトだと$this->collection
となっている。
指定したいResourceクラスのcollectionを使って呼び出す。
UserResource::collection($this->collection)
UserCollection
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\ResourceCollection;
class UserCollection extends ResourceCollection
{
/**
* Transform the resource collection into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
return [
'data' => UserResource::collection($this->collection),
'count' => $this->collection->count(),
'statuses' => UserStatusEnum::values(),
];
}
}
Resourceクラス
実装する時のポイント
$this->
パラメータ名を指定して値が取得できます。
コード値の文字列変換や、必要なパラメータのみを定義することが出来ます。
UserResource
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\JsonResource;
class UserResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
return [
'id' => $this->id,
'name' => $this->name,
'status' => UserStatusEnum::description($this->status),
];
}
}