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();
我用 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();