基本の API Resource。単一の Message
モデルを整形してくれる。
<?php
namespace App\Http\Resource;
use Illuminate\Http\Resources\Json\JsonResource;
class MessageResource extends JsonResource {
public function toArray($request){
return [
"message" => $this->message,
"message_at" => $this->message_at,
];
}
}
単一の Eloquent モデルを使って Resource を new して使えるし、
$route->get("/message/{id}",function(Message $message){
return new MessageResource($message);
});
複数の Eloquent モデルをラップして使うことも出来る。
$route->get("/messages",function(){
return MessageResource::collection(Message::all());
});
レスポンスボディの下層に混ぜることも可能
$route->get("/message/{id}",function(Message $message){
return [
"message" => new MessageResource($message)
];
});
Collection
基本のコレクションリソース
<?php
namespace App\Http\Resource;
use Illuminate\Http\Resources\Json\ResourceCollection;
class MessagesCollection extends ResourceCollection {
public function toArray($request){
return $this->collection;
}
}
コレクションのコンストラクタには コレクションのみが渡せる。
$route->get("/messages",function(){
return new MessagesCollection(Message::all());
});
コレクションリソースはちょっとややこしい。
直接コレクションリソースを返却した場合、data
キーの中に toArray
の値が展開される。
上記の例では data
キーがルートに生えて、その中に message
が並ぶ。
$route->get("/messages",function(){
return [
"messages" => new MessagesCollection(Message::all())
];
});
上記のように、レスポンスのサブ要素として コレクションを利用した場合 data
キーはつかない。
そのまま messages
キーの中に message
が並ぶ。
もちろん、コレクションリソースの中で値を変換できる。
<?php
namespace App\Http\Resource;
use Illuminate\Http\Resources\Json\ResourceCollection;
class MessagesCollection extends ResourceCollection {
public function toArray($request){
return MessageResource::collection($this->collection);
}
}
自動的に付与される data
キーの名前は static
の $wrap
で変更できる。
<?php
namespace App\Http\Resource;
use Illuminate\Http\Resources\Json\ResourceCollection;
class MessagesCollection extends ResourceCollection {
static public $wrap = "messages";
public function toArray($request){
return MessageResource::collection($this->collection);
}
}