Ответ 1
Для тех, кто попадает на это позже, и поскольку мне было очень тяжело это сделать, я хотел бы поделиться тем, как я работал в своем 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,
...
}
]
Или, я хочу добавить конверт, вам просто нужно установить ключ ресурса в контроллере. Заменить:
return $this->response->collection($items, new UserTransformer());
по
return $this->response->collection($items, new UserTransformer(), ['key' => 'users']);
И ответ будет выглядеть так:
{
"users": [
{
"user_id": 1,
...
},
{
"user_id": 2,
...
}
]
}