Laravel : Dingo/API 分页自定义根键

Laravel : Dingo/API Pagination custom root key

我用 Laravel 5 和 Dingo/API 开发了一个 API。

根据文档,我使用了分页,我的代码看起来像这样

$users = User::paginate(50);

return $this->response->paginator($users, new UserTransformer);

很遗憾,响应根键是"data"

{
"data": [
{
  "id": 1,
  "username": "superuser", 
......

我想将 "data" 键更改为自定义键,因为在我的例子中,emberjs 收到此响应并尝试使用 link =36=] 不存在的模型,如果是 RESTAdapter,则需要将密钥设置为与 ember 模型相同的名称。

我已经在响应中尝试了一些参数,但没有任何变化

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

return $this->response->paginator($users, new UserTransformer, ['identifier' => 'users']);

没有任何效果,我被 "data" 键卡住了。

有人有解决办法吗?

提前致谢。

我设法解决了我的问题。

我不修改api.php配置,变压器保持不变

'transformer' => env('API_TRANSFORMER', Dingo\Api\Transformer\Adapter\Fractal::class),

首先我创建了一个新的序列化器

// app/Api/V1/Serializers/CustomJsonSerializer.php

<?php namespace App\Api\V1\Serializers;

use League\Fractal\Pagination\CursorInterface;
use League\Fractal\Pagination\PaginatorInterface;
use League\Fractal\Serializer\SerializerAbstract;


/**
 * Create a new Serializer in your project
 */
use League\Fractal\Serializer\ArraySerializer;

class CustomJsonSerializer extends ArraySerializer
{
    public function collection($resourceKey, array $data)
    {
        if ($resourceKey === false) {
            return $data;
        }
        return array($resourceKey ?: 'data' => $data);
    }

    public function item($resourceKey, array $data)
    {
        if ($resourceKey === false) {
            return $data;
        }
        return array($resourceKey ?: 'data' => $data);
    }
}

我在 AppServiceProviders 中设置了新的自定义序列化程序

// app\Providers\AppServiceProviders.php

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Dingo\Api\Transformer\Adapter\Fractal;
use League\Fractal\Manager;
use App\Api\V1\Serializers\CustomJsonSerializer;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        $this->app['Dingo\Api\Transformer\Factory']->setAdapter(function ($app) {
             $fractal = new Manager();
             $fractal->setSerializer(new CustomJsonSerializer());
             return new Fractal($fractal);
        });
    }

    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}

希望对大家有所帮助:)

或者你可以使用类似这样的东西

Answer::where('question_id', '=', $questionId)
  ->join('articles', 'answers.article_id', '=', 'articles.id')
  ->orderBy('count_thanks', 'desc')
  ->limit($perPage)
  ->offset($offset)
  ->get();