0

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

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

$users = User::paginate(50);

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

不幸的是,响应根键是“数据”

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

我想将“数据”键更改为自定义键,因为在我的情况下,emberjs 收到此响应并尝试与不存在的“基准”模型建立链接,需要设置键在 RESTAdapter 的情况下,与 ember 模型同名。

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

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

或者

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

没什么用,我被“数据”键困住了。

有人有解决方案吗?

先感谢您。

4

2 回答 2

1

我设法解决了我的问题。

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

'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()
    {
        //
    }
}

我希望它会帮助人们:)

于 2017-01-19T20:22:19.353 回答
-3

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

Answer::where('question_id', '=', $questionId)
  ->join('articles', 'answers.article_id', '=', 'articles.id')
  ->orderBy('count_thanks', 'desc')
  ->limit($perPage)
  ->offset($offset)
  ->get();
于 2017-05-09T13:18:46.913 回答