澳洲野狗API删除“数据”信封

是否有一种简单的方法可以从Dingo API响应中删除“数据”信封

当我使用此转换器转换用户模型时:

类用户变压器扩展了EloquentModelTransformer
{
/**
*可能包括的资源清单
*
*@var数组
*/
受保护的$availableIncludes=[
“角色”
];
受保护的$defaultIncludes=[
“角色”
];
公共职能转变($模式)
{
if(!$model instanceof User)
抛出新的InvalidArgumentException($model);
返回[
“id”=>$model->id,
“名称”=>$model->名称,
“电子邮件”=>$model->电子邮件
];
}
/**
*包括角色
*
*@param User$User
*@return\League\Fractal\Resource\Item
*/
公共函数includeRoles(用户$User)
{
$roles=$user->角色;
返回$this->集合($roles,new RoleTransformer());
}

我得到的答复是:

{
数据:[
“id”:102,
“名称”:“Simo”,
“电子邮件”:[email protected]",
“角色”:{
“数据”:[
{
“id”:1
“名称”:“管理员”
}
]
}
}
]
}

我读了一些关于RESTfulAPI的文章,其中很多文章都说这种封装响应不是很现代(应该改用HTTP头)

我如何至少在包含项中禁用此行为

多谢各位

对于那些后来认识到这一点的人,由于我很难做到这一点,我想分享一下我是如何在API中实现这一点的:

1) 创建一个自定义序列化程序,NoDataArraySerializer.php

名称空间App\Api\V1\Serializers;
使用League\Fractal\Serializer\ArraySerializer;
类NodeDataArraySerializer扩展了ArraySerializer
{
/**
*序列化集合。
*/
公共函数集合($resourceKey,array$data)
{
return($resourceKey)?[$resourceKey=>$data]:$data;
}
/**
*序列化项目。
*/
公共函数项($resourceKey,数组$data)
{
return($resourceKey)?[$resourceKey=>$data]:$data;
}
}

2) 设置新的序列化程序。在bootstrap/app.php中添加:

$app['Dingo\Api\Transformer\Factory']->setAdapter(函数($app){
$fractal=新联盟\fractal\Manager;
$fractal->设置序列化程序(新应用程序\Api\V1\Serializers\NoDataArraySerializer);
返回新的Dingo\Api\Transformer\Adapter\Fractal($Fractal);
});

就这样

现在,在您的用户控制器中(例如),您可以这样使用它:

名称空间App\Api\V1\Controllers;
使用App\Api\V1\Models\User;
使用App\Api\V1\Transformers\UserTransformer;
类UserController扩展控制器
{
公共职能指数()
{
$items=User::all();
返回$this->response->集合($items,new UserTransformer());
}
}

反应会是这样的:

[
{
“用户id”:1,
...
},
{
“用户id”:2,
...
}
]

或者,如果您想要添加一个信封,您只需要在控制器中设置资源密钥。替换:

返回$this->回应->集合($items,new UserTransformer());

返回$this->回应->集合($items,new UserTransformer(),['key'=>'users']);

反应会是这样的:

{
“用户”:[
{
“用户id”:1,
...
},
{
“用户id”:2,
...
}
]
}

发表评论