04
2019

LaravelでPaginatorをカスタムクラスに差し替える

CATEGORYPHP
またLaravelネタ。Laravel 5.7でJSON APIを作るにあたって、標準のLengthAwarePaginatorをそのまま使うと余計なプロパティが返ってしまうのでオーバーライドしたかった。最初はModel::paginate()をオーバーライドしようかと思ったけど、そんなことせずとも以下のようにDIで簡単に出来た。
namespace App\Models;

use Illuminate\Pagination\LengthAwarePaginator;

class JsonLengthAwarePaginator extends LengthAwarePaginator
{
public function toArray() : array
{
return [
'currentPage' => $this->currentPage(),
'data' => $this->items->toArray(),
'from' => $this->firstItem(),
'lastPage' => $this->lastPage(),
'perPage' => $this->perPage(),
'to' => $this->lastItem(),
'total' => $this->total(),
];
}
}
namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
public function boot() : void
{
}

public function register() : void
{
$this->app->bind(
'Illuminate\Pagination\LengthAwarePaginator',
'App\Models\JsonLengthAwarePaginator'
);
}
}
paginate()でLengthAwarePaginatorインスタンスを生成してるのはBuildsQueries::paginator()だったけど、こいつが親切にもDIを使ってインスタンスを作っているので、設定を書き換えるだけでいけた。
なお、simplePaginate()の場合はPaginatorクラスが返るので、必要ならそちらも設定忘れずに。
スポンサーサイト



Tag: PHP Laravel

0 Comments

Leave a comment