是否有一种简单的方法可以从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,
...
}
]
}