Tuesday, 15 January 2013

php - Is it possible to use multiple Fractal Transformers in a pagination? -



php - Is it possible to use multiple Fractal Transformers in a pagination? -

i have controller returns of users likes. these likes can gig or track. haves used polymorphic relationships accomplish this. both gigs , tracks have own fractal transformer works on own. helpful if returned response likes controller json response containing both gigs , tracks objects within it. hope understand mean here brief example.

the response this:

{ "data": [ { "id": 1, "user_id": 2, "name": "test", "genre": "test", "description": "", "venue": "test", "date": { "date": "-0001-11-30 00:00:00", "timezone_type": 3, "timezone": "utc" }, "lineup": "", "price": "0", "currency": "", "image": false, "attending_count": 0 }, { "id": 2, "user_id": 2, "name": "test", "genre": "test", "description": "", "uri" : "http://example.com/track", }, ], "meta": { "pagination": { "total": 2, "count": 2, "per_page": 50, "current_page": 1, "total_pages": 1, "links": [] } } }

as can see 2 different parts response. nest arrays farther had track: [ , gig: [. @ later.

here's have far.

$user = user::find($userid); if (! $user){ homecoming $this->respondnotfound("this user not found."); } $arr = []; foreach ($user->likes()->get() $like) { if($like->likeable_type == 'gig'){ $item = new fractal\resource\item($like->likeable, new gigtransformer); } elseif($like->likeable_type == 'track'){ $item = new fractal\resource\item($like->likeable, new tracktransformer); } $arr[] = $item; } $paginator = paginator::make($arr, count($arr), 50); homecoming $paginator;

this returns pagination right count of items no data.

if don't understand have said please leave comment.

many thanks

after working through best part of day have figured out , have learnt quite lot objects , like.

here's have.

$user = user::find($userid); if (! $user){ homecoming $this->respondnotfound("this user not found."); } $obj = new arrayobject(); $fractal = new fractal\manager(); $fractal->setserializer(new fractal\serializer\jsonapiserializer()); foreach ($user->likes()->get() $like) { if($like->likeable_type == 'gig'){ $item = new fractal\resource\item($like->likeable, new gigtransformer, 'gig'); } elseif($like->likeable_type == 'track'){ $item = new fractal\resource\item($like->likeable, new tracktransformer, 'track'); } $obj->append($fractal->createdata($item)->toarray()); } $paginator = paginator::make((array) $obj, $obj->count(), 50); $response = [ 'likes' => (array) $obj, 'meta' => [ 'pagination' => [ 'total' => $paginator->gettotal(), 'count' => $paginator->count(), 'per_page' => $paginator->getperpage(), 'current_page' => $paginator->getcurrentpage(), 'total_pages' => $paginator->getlastpage(), 'links' => $paginator->links(), ], ] ]; homecoming ($this->respond($response));

i should think can see going on here quite easily.

i used arrayobject maintain fractal item object without type hinting array , still utilize array functions. fractal items appended arrayobject paginated. wanted display pagination in particular way likes wrapping user info , meta wrapping pagination data. respond() method utilize throughout controllers respond in json format.

hopefully help looking similiar thing. love laravel.

php laravel

No comments:

Post a Comment