我正在使用jsonApiSerializer的联盟/分形,
我有json输出的用户集合。 现在我想为这个json响应添加一些过滤器数据(就像用户计算当前过滤器一样)。
我明白了:
$resource = new Collection($dataProvider->getData(), new UserTransformer());
//我发现包含一些非直接链接数据的唯一方法是使用setMeta():
$resource->setMetaValue('projects', $dataProvider->getProjects());
$resource->setMetaValue('somes', $dataProvider->getTasks());
但是! '项目'和'somes'集合(是的,它们也是集合)也包含在其中的“数据”键中。
所以,我有这个结构:
{
'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 :(得分:0)
这有点黑客,但没有重构的Scope类,在fractal的League \ Fractal \ Manager :: createData()中硬编码并且只能使用你自己的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);
这就是你所需要的。希望这会有所帮助。