Я разработал 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']);
Ничего не работает, я застрял с ключом «данных».
У кого-нибудь есть решение?
Заранее спасибо.
Мне удалось исправить мою проблему.
Я не изменяю конфигурацию 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();