2016-03-28 9 views
5

Ho l'API che funziona utilizzando il processo standard, ma voglio rimuovere lo spazio dei nomi data dall'output JSON. Vedo che ho bisogno di implementare ArraySerializer, ho passato i documenti Fractal, ma non riesco a capire dove devo aggiungerlo in Laravel 5.2Tentativo di rimuovere i dati in Fractal implementando ArraySerializer in Laravel 5.2

Ho trovato this answer ma ho appena ottenuto lo stesso risultato linea di codice che ho commentata:

class TrackController extends ApiController 
{ 
    public function index() 
    { 
     $tracks = Track::all(); 
     //return $this->respondWithCollection($tracks, new TrackTransformer); 
     // Same response as the commented out line above 
     $response = new \League\Fractal\Resource\Collection($tracks, new TrackTransformer); 
     $manager = new \League\Fractal\Manager(); 
     $manager->setSerializer(new \League\Fractal\Serializer\ArraySerializer()); 
     return response()->json($manager->createData($response)->toArray()); 
    } 

    public function show($id) 
    { 
     $track = Track::find($id); 
     return $this->respondWithItem($track, new TrackTransformer); 
    } 
} 

Inoltre, sto applicazione del presente su un controller specifico, anche se ho ottenuto questo lavoro, in cui si aggiunge il codice/class in modo da poter ottenere l'output ArraySerializer per tutta la mia i controllori?

ho posted this on Github se questo aiuta.

+0

prima impressione, penso che si dovrebbe spostare '$ response = new \ lega \ Frattale \ Resource \ Collection ($ tracce, nuovo TrackTransformer);' dopo hai impostato il serializzatore –

+1

Dove lo sposterei? –

+1

'$ manager = new \ League \ Fractal \ Manager(); $ manager-> setSerializer (nuovo \ League \ Fractal \ Serializer \ ArraySerializer()); $ response = new \ League \ Fractal \ Resource \ Collection ($ tracks, new TrackTransformer); ' –

risposta

2

È necessario creare il proprio MySerializer estensioni di DataArraySerializer e utilizzarlo invece del valore predefinito. Predefinito DataArraySerializer hanno tre metodi e in ciascuno di essi deve cambiare i valori di ritorno a questo:

use League\Fractal\Serializer\DataArraySerializer; 

class MySerializer extends DataArraySerializer 
{ 
    /** 
    * Serialize a collection. 
    * 
    * @param string $resourceKey 
    * @param array $data 
    * 
    * @return array 
    */ 
    public function collection($resourceKey, array $data) 
    { 
     return $data; 
    } 

    /** 
    * Serialize an item. 
    * 
    * @param string $resourceKey 
    * @param array $data 
    * 
    * @return array 
    */ 
    public function item($resourceKey, array $data) 
    { 
     return $data; 
    } 

    /** 
    * Serialize null resource. 
    * 
    * @return array 
    */ 
    public function null() 
    { 
     return []; 
    } 

} 

Quindi si modifica il comportamento del meccanismo di serializzare e ottenere il risultato come si desidera.

+0

Grazie! Peccato che questa non sia un'opzione integrata. – Staysee

0

Se si utilizza spatie/laravel-fractal pacchetto o spatie/fractalistic, allora si può togliere la chiave data dai risultati utilizzando la matrice serializzatore Spatie Spatie\Fractalistic\ArraySerializer() invece di serializzatore predefinito del frattale.

è possibile utilizzare è come questo:

Fractal::create() 
    ->collection($books) 
    ->transformWith(function($book) { return ['id' => $book['id']];}) 
    ->serializeWith(new \Spatie\Fractalistic\ArraySerializer()) 
    ->toArray(); 

Ciò restituirà ..

[ 
    ['id' => 1], 
    ['id' => 2] 
] 

Invece di ..

[ 
    'data' => [ 
     ['id' => 1], 
     ['id' => 2] 
    ] 
] 

Oppure, se si desidera utilizzare lo Spatie serializzatore a livello globale, aggiungilo nel file config/fractal.php in questo modo:

<?php 

return [ 
    /* 
    * The default serializer to be used when performing a transformation. It 
    * may be left empty to use Fractal's default one. This can either be a 
    * string or a League\Fractal\Serializer\SerializerAbstract subclass. 
    */ 
    'default_serializer' => new Spatie\Fractalistic\ArraySerializer(), 
    . 
    . 
    . 
]; 

Maggiori informazioni, consultare: Using a serializer

Problemi correlati