2017-09-24 12 views
5

アイテムリソースとコレクションリソースの異なるデータを定義できるかどうかは疑問でした。Laravel 5.5コレクション用のAPIリソース(スタンドアロンデータ)

私だけ ['id', 'title', 'slug']を送信したいが、アイテムのリソースが、私はのような何かを達成したい余分な詳細 ['id', 'title', 'slug', 'user', etc.]

が含まれていますコレクションのために

:ので、予想通りPageResourceCollectionは動作しません

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

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

それは使用するPageResourceそれが必要です

return [ 
      'data' => $this->collection, 
     ]; 

私はPageFullResource/PageListResourcePageFullResourceCollection/PageListResourceCollectionにリソースを複製することができますが、私は同じ結果を達成するためのより良い方法を見つけようとしています。

答えて

4

リソースクラスには、コレクションメソッドがあります。これをResourceCollectionへのパラメータ入力として返すことができ、コレクションに変換を指定できます。

コントローラー:

class PageController extends Controller 
{ 
    public function index() 
    { 
     return new PageResourceCollection(PageResource::collection(Page::all())); 
    } 

    public function show(Page $page) 
    { 
     return new PageResource($page); 
    } 
} 

リソース:あなたが、リンクやメタデータを使用することに興味を持っていない場合

class PageResource extends Resource 
{ 
    public function toArray($request) 
    { 
     return [ 
      'id' => $this->id, 
      'title' => $this->title, 
      'slug' => $this->slug, 
      'user' => [ 
       'id' => $this->user->id, 
       'name' => $this->user->name, 
       'email' => $this->user->email, 
      ], 
     ]; 
    } 
} 

class PageResourceCollection extends ResourceCollection 
{ 
    public function toArray($request) 
    { 
     return [ 
      'data' => $this->collection->transform(function($page){ 
       return [ 
        'id' => $page->id, 
        'title' => $page->title, 
        'slug' => $page->slug, 
       ]; 
      }), 
     ]; 
    } 
} 
+1

Laravelがコレクション内の各項目に対して 'PageResource'を単独で作成することができればいいでしょう。 –

+0

@DeesOomens実際にはそうです: 'return PageResource :: collection($ collection);' – HCK

0

受け入れ答えは、動作します。必要に応じて、返信:

return new PageResourceCollection(Page::paginate(10)); 

また、リソース・コレクションに渡す前に、他の従属関係を熱心にロードする必要があります。