Laravel: пользовательский корневой ключ Dingo / API Pagination

Я разработал API с помощью Laravel 5 и Dingo / API.

Следуя документации, я использовал нумерацию страниц и мой код выглядит так

$users = User::paginate(50);

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

К сожалению, корневой ключ ответа — «данные»

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

Я хотел бы изменить ключ «data» на пользовательский, потому что в моем случае emberjs получает этот ответ и пытается создать ссылку с моделью «datum», которая не существует, ключ должен быть установлен с помощью то же имя, что и модель ember в случае RESTAdapter.

Я уже пробовал некоторые параметры в ответе, но ничего не изменилось

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

или же

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

Ничего не работает, я застрял с ключом «данных».

У кого-нибудь есть решение?

Заранее спасибо.

0

Решение

Мне удалось исправить мою проблему.

Я не изменяю конфигурацию 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()
{
//
}
}

Я надеюсь, что это поможет чел 🙂

1

Другие решения

или вы можете использовать что-то вроде этого

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

По вопросам рекламы [email protected]