12

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 ヘッダーを使用する必要があります)。

少なくともインクルードに対してこの動作を無効にするにはどうすればよいですか?

ありがとうございました

4

3 に答える 3

14

後でこれに陥った人のために、私がそれを作るのに本当に苦労したので、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,
            ...
        }
    ]
}
于 2016-02-24T13:08:39.563 に答える
3

http://fractal.thephpleague.com/serializers/#arrayserializerをご覧ください。彼らはいつ何をすべきかを正確に説明します

アイテムの「データ」名前空間を削除したい場合があります

于 2016-01-19T07:59:58.473 に答える