gpt4 book ai didi

laravel - Dingo API 删除 "data"信封

转载 作者:行者123 更新时间:2023-12-04 00:41:35 30 4
gpt4 key购买 nike

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

当我使用这个 Transformer 来转换用户模型时:

class UserTransformer extends EloquentModelTransformer
{

/**
* List of resources possible to include
*
* @var array
*/
protected $availableIncludes = [
'roles'
];

protected $defaultIncludes = [
'roles'
];

public function transform($model)
{
if(! $model instanceof User)
throw new InvalidArgumentException($model);

return [
'id' => $model->id,
'name' => $model->name,
'email' => $model->email
];
}

/**
* Include Roles
*
* @param User $user
* @return \League\Fractal\Resource\Item
*/
public function includeRoles(User $user)
{
$roles = $user->roles;

return $this->collection($roles, new RoleTransformer());
}

我得到这个回应:
{
data : [
"id": 102,
"name": "Simo",
"email": "mail@outlook.com",
"roles": {
"data": [
{
"id": 1
"name": "admin"
}
]
}
}
]
}

我阅读了一些关于 RESTful API 的文章,其中很多都表示这种封装的响应不是很现代(您应该使用 HTTP header 代替)。

如何至少为包含禁用此行为?

谢谢

最佳答案

对于那些后来遇到这个问题并且我真的很难做到的人,我想分享我是如何让它在我的 API 中工作的:

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

namespace App\Api\V1\Serializers;

use League\Fractal\Serializer\ArraySerializer;

class NoDataArraySerializer extends ArraySerializer
{
/**
* Serialize a collection.
*/
public function collection($resourceKey, array $data)
{
return ($resourceKey) ? [ $resourceKey => $data ] : $data;
}

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

2) 设置新的序列化程序。在 bootstrap/app.php 中,添加:
$app['Dingo\Api\Transformer\Factory']->setAdapter(function ($app) {
$fractal = new League\Fractal\Manager;
$fractal->setSerializer(new App\Api\V1\Serializers\NoDataArraySerializer);
return new Dingo\Api\Transformer\Adapter\Fractal($fractal);
});

就是这样。

现在,在您的 UserController(例如)中,您可以像这样使用它:
namespace App\Api\V1\Controllers;

use App\Api\V1\Models\User;
use App\Api\V1\Transformers\UserTransformer;

class UserController extends Controller
{
public function index()
{
$items = User::all();

return $this->response->collection($items, new UserTransformer());
}
}

响应将如下所示:
[
{
"user_id": 1,
...
},
{
"user_id": 2,
...
}
]

或者,我要添加一个信封,您只需要在Controller中设置资源键即可。替换:
return $this->response->collection($items, new UserTransformer());


return $this->response->collection($items, new UserTransformer(), ['key' => 'users']);

响应将如下所示:
{
"users": [
{
"user_id": 1,
...
},
{
"user_id": 2,
...
}
]
}

关于laravel - Dingo API 删除 "data"信封,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33454645/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com