2017-09-24 112 views
5

Öğe kaynağı ve koleksiyon kaynağı için farklı veriler tanımlamanın mümkün olup olmadığını merak ediyordum.Laravel 5.5 Koleksiyonlar için API kaynakları (bağımsız veri)

koleksiyonu için sadece ['id', 'title', 'slug'] göndermek istiyorum ama madde kaynak gibi bir şey elde etmek istediğiniz ek ayrıntılar

['id', 'title', 'slug', 'user', etc.] içerecektir: çünkü beklenen çalışmayacak olarak

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, 
     ]; 
    } 
} 

PageResourceCollection PageResource kullanır, bu nedenle

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

Ben PageFullResource/PageListResource ve PageFullResourceCollection/PageListResourceCollection içine kaynak çoğaltmak olabilir ama aynı sonucu elde etmek daha iyi bir yol bulmaya çalışıyorum.

cevap

4

Kaynak sınıfında bir toplama yöntemi vardır. Bunu, KaynakKoleksiyonunuza parametre girişi olarak geri döndürebilir ve daha sonra koleksiyondaki dönüşümlerinizi belirtebilirsiniz.

Denetleyici:

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

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

Kaynaklar: bağlantıları ve meta verileri kullanarak ilgilenmiyor eğer

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, koleksiyondaki her öğe için bir “PageResource” yaratabilseydi hoş olurdu. –

+0

@DeesOomens aslında yapıyor: sadece PageResource :: collection ($ collection); – HCK

0

kabul cevap, çalışır. İsterseniz, kontrolörünüzde

'u döndürün. Ayrıca, kaynak koleksiyonuna geçmeden önce diğer bağımlı ilişkilere karşı istekli yüke bakmalısınız.