2015-08-28 35 views
0

我使用的是JsonApiSerializer聯盟/分的數據,如何包括直接徵收元分變換對象,而關鍵

我已經得到了用戶收集JSON輸出。 現在我想添加一些過濾器數據到這個JSON響應(就像用戶計數當前過濾器)。

我得到這個:

$resource = new Collection($dataProvider->getData(), new UserTransformer()); 

//唯一的辦法,包括一些沒有直接聯繫的數據,我發現使用setMeta():

$resource->setMetaValue('projects', $dataProvider->getProjects()); 
    $resource->setMetaValue('somes', $dataProvider->getTasks()); 

但是! '項目'&'somes'集合(是的,它們也是集合)也包含在'data'鍵中。

所以,我有這樣的結構:

{ 
    'data' => [ 
     {//user1},{//user2},... 
    ], 
    'meta' => { 
     'projects' => { 
       'data' => {...} 
     }, 
     'somes' => { 
       'data' => {...} 
     } 
    } 
} 

,但我想是這樣的:

{ 
    'data' => [ 
     {//user1},{//user2},... 
    ], 
    'meta' => { 
     'projects' => {...}, //there is no 'data' key 
     'somes' => {...}  //there is no 'data' key 
    } 
} 

我該怎麼辦?

回答

0

這是有點破解,但沒有重構工作正常在分形的League \ Fractal \ Manager :: createData()中硬編碼的Scope類是使用您自己的Scope類實現的唯一方法是在Manager的擴展中重載此方法。

<?php 
use League\Fractal\Serializer\JsonApiSerializer; 

/** 
* Class EmbedSerializer 
*/ 
class EmbedSerializer extends JsonApiSerializer 
{ 
    const RESOURCE_EMBEDDED_KEY = 'embedded'; 

    /** 
    * Serialize a collection. 
    * 
    * @param string $resourceKey 
    * @param array $data 
    * @return array 
    */ 
    public function collection($resourceKey, array $data) 
    { 
     return $resourceKey === self::RESOURCE_EMBEDDED_KEY ? $data : [$resourceKey ?: 'data' => $data]; 
    } 

    /** 
    * Serialize an item. 
    * 
    * @param string $resourceKey 
    * @param array $data 
    * @return array 
    */ 
    public function item($resourceKey, array $data) 
    { 
     return $resourceKey === self::RESOURCE_EMBEDDED_KEY ? $data : [$resourceKey ?: 'data' => [$data]]; 
    } 
} 

所以,現在我可以這樣使用它:

/** @var $this->fractal League\Fractal\Manager */ 
    $this->fractal->setSerializer(new EmbedSerializer()); 

    $projectsCollection = $this->fractal->createData(
     new Collection($projects, new UserProjectTransformer(), 'embedded') 
    )->toArray(); 

    $resource = new Collection($users, new UserTransformer()); 
    $resource->setMetaValue('projects', $projectsCollection); 

這就是所有u需要。希望這會有所幫助。