LoginSignup
9
10

More than 5 years have passed since last update.

Laravel API Resource についてのあれこれ

Posted at

基本の 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);
    }
}

9
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
10