2017-03-02 4 views
2

Ich benutze Fraktale (fractal.thephpleague.com), um eine API mit Laravel (laravel.com) zu entwickeln. Es ist übrigens eine erstaunliche Bibliothek.Laravel + Fraktal "tief" geschachtelt enthält

In bestimmten Web-Service, muss ich Informationen von mehreren verschachtelten Modelle, die 3 Ebenen tief haben, zurückgeben. Das heißt, ich habe eine Umfrage Modell, die viele Survey Artikel hat, und jeder von ihnen hat wiederum viele Umfrage Artikel Ergebnisse (jeder von einem Benutzer). Nun, ich brauche die Daten aus allen von ihnen, klassifiziert, das heißt:

"surveys": [ 
    { 
     "id": 1, 
     ..., 
     "items": [ 
      { 
       "id": 14, 
       ..., 
       "results": [ 
        { 
         "id": 45, 
         ... 
        }, 
        { 
         ... 
        } 
       ] 
      }, 
      { 
       ... 
      } 
     ] 
    }, 
    { 
     ... 
    } 
} 

Mit Transformatoren und umfasst, erhalte ich die Umfragen und Umfrage Artikel Info ohne Probleme, aber ich brauche auch die Umfrageergebnisse Artikel ... Das heißt, ich brauche etwas wie 2-Ebene "verschachtelte" enthält, um die Informationen der dritten Ebene zu erhalten.

Meine beste Vorgehensweise, bisher (nur zwei Ebenen zurück: Umfragen und Umfrageartikel). In meinem Controller:

return fractal() -> transform(
    Survey::where(...), 
    new SurveyTransformer() 
) -> include(['SurveyItems']) -> respond(); 

Jede Hilfe wird sehr geschätzt. Vielen Dank im Voraus.

+0

Sie die Sie für die Ergebnisse auf Ihre ItemTransformer enthalten? –

+0

Ja, natürlich. – andcl

Antwort

2

Hier ist, was ich normalerweise

Umfrage Transformator

<?php 
namespace App\Transformers; 

use League\Fractal; 
use App\Survey; 

class SurveyTransformer extends Fractal\TransformerAbstract 
{ 
    /** 
    * List of resources possible to include 
    * 
    * @var array 
    */ 
    protected $availableIncludes = [ 
     'items' 
    ]; 

    public function transform(Survey $survey) 
    { 
     return [ 
      'id' => (int) $user->id, 
     ]; 
    } 


    /** 
    * Include Items 
    * 
    * @param App\Survey $survey 
    * @return League\Fractal\CollectionResource 
    */ 
    public function includeItems(Survey $survey) 
    { 
     $items = $survey->items; 
     if (!is_null($items)) { 
      return $this->collection($items, new ItemTransformer); 
     } 
     return; 
    } 
} 

Artikel Transformator

<?php 
namespace App\Transformers; 

use League\Fractal; 
use App\Item; 

class ItemTransformer extends Fractal\TransformerAbstract 
{ 
    /** 
    * List of resources possible to include 
    * 
    * @var array 
    */ 
    protected $availableIncludes = [ 
     'results' 
    ]; 

    public function transform(Item $item) 
    { 
     return [ 
      'id' => (int) $user->id, 
     ]; 
    } 


    /** 
    * Include results 
    * 
    * @param App\Item $item 
    * @return League\Fractal\CollectionResource 
    */ 
    public function includeResults(Item $item) 
    { 
     $results = $item->results; 
     if (!is_null($results)) { 
      return $this->collection($results, new ResultTransformer); 
     } 
     return; 
    } 
} 
tun

Auf meiner Basis-Controller

/** 
    * get fractal tranformed data 
    * @param $resource 
    */ 
    protected function fractalResponse($resource, array $includes = []) 
    { 
     $manager = new Manager(); 
     $manager->setSerializer(new DataArraySerializer()); //or what ever you like 

     if (sizeof($includes) == 0) { 
      $data = $manager->createData($resource) 
       ->toArray(); 
     } else { 
      $manager->parseIncludes($includes); 
      $data = $manager->createData($resource) 
       ->toArray(); 
     } 
     return $data; 
    } 

dann

$resource = new \League\Fractal\Resource\Collection($survies, new SurveyTransformer); 
$response_data = $this->fractalResponse($resource, ['items.results']) 
+0

Vielen Dank für die Antwort, aber ich habe genau diese Struktur (Methode includeItems in SurveyTransformer und includeResults in SurveyItemTransformer) codiert, und es gibt die Elemente und am Ende von ihnen einen Schlüssel namens "items.results" mit einem Wert von 'null'. Irgendwelche Ideen, was könnte dieses Verhalten verursachen? – andcl

+0

Wurden die Ergebnisse angezeigt, wenn Sie dump für die Methode includeResuts auf itemtransformer hinzufügen? –

+0

Ok, ich habe das Laravel Responder (https://github.com/flugger/laravel-responder) -Paket in der API verwendet, und es sieht so aus, als ob diese Funktion im Paket fehlerhaft ist (https://github.com/flugger/laravel-responder/issues/33) ... Also werde ich zu einem anderen Laravel-Fraktal-Paket wechseln oder versuchen, dieses Problem zu umgehen, da ich bisher viele Dinge entwickelt habe, um alles zu ändern ... Vielen Dank trotzdem . – andcl