2016-03-28 42 views
5

我已經使用標準過程來使用API​​,但是我想從JSON輸出中刪除data命名空間。我看到我需要實現ArraySerializer,我已經通過分形文檔,但我無法確定需要將它添加到Laravel 5.2中的位置。嘗試通過在Laravel 5.2中實現ArraySerializer來移除分形中的數據

我找到了this answer,但我只是得到了相同的輸出行代碼我註釋掉:

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); 
    } 
} 

而且,我是一個特定的控制器上實現這一點,就算我得到了這個工作,我在哪裏添加代碼/類,所以我可以得到ArraySerializer這樣輸出的所有我的控制器?

我已經posted this on Github如果有幫助。

+0

的第一印象,我想你應該移動 '$響應=新\聯賽\分形\資源\集($曲目,新TrackTransformer);' 後你設置串行器 –

+1

我將它移動到哪裏? –

+1

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

回答

2

您需要創建自己MySerializer擴展DataArraySerializer並使用它來代替默認值。默認DataArraySerializer有三種方法和他們每個人需要改變返回值是:

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

} 

所以你改變了序列化機制的行爲,並得到結果如你所願。

+0

謝謝!太糟糕了,這不是一個內置的選項。 – Staysee

0

如果使用spatie/laravel-fractal包或spatie/fractalistic,那麼你就可以使用,而不是分形的默認的序列的Spatie陣列串行Spatie\Fractalistic\ArraySerializer()移除的結果data關鍵。

您可以使用是這樣的:

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

這將返回..

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

而不是..

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

或者,如果你想使用Spatie串行器,將其添加到config/fractal.php這樣的文件中:

<?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(), 
    . 
    . 
    . 
]; 

更多信息,請參見:Using a serializer

相關問題