对于那些后来遇到这个问题的人,因为我真的很难做到这一点,我想分享一下我是如何让它在我的 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) 设置新的序列化器。在引导程序/app.php, add :
$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);
});
就是这样。
现在,在你的用户控制器(例如),你可以像这样使用它:
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,
...
}
]
或者,我想添加一个信封,你只需要在控制器中设置资源键即可。代替 :
return $this->response->collection($items, new UserTransformer());
by
return $this->response->collection($items, new UserTransformer(), ['key' => 'users']);
响应将如下所示:
{
"users": [
{
"user_id": 1,
...
},
{
"user_id": 2,
...
}
]
}